正确使用常量 c++
Correct use of const c++
我有这个示例代码(下面),example1() 方法工作没有问题,example2() 类似,但我必须强制const_char使其编译,尽管我认为不需要 example1() 方法,也不需要 example2()。
我的问题是,我如何修改 add() 方法以使两者都编译,或者如何在 example2() 中正确调用 buffer.add() 而不强制const_cast? add() 方法没有修改项目,所以const_cast是不必要的。哪种形式是正确的或合适的?
下面是示例代码:
template <class Item>
class Buffer
{
public:
Item * _pItems;
int _nItems;
// ... constructor / destructors etc
void add( const Item & item ) // or maybe Item const & item
{
_pItems[_nItems++] = item;
}
};
class MyClass
{
public:
// data
};
void example1( const MyClass & item )
{
Buffer<MyClass> buffer;
buffer.add( item ); // WORKS, no problem
}
void example2( const MyClass & item )
{
Buffer<MyClass *> buffer; // NOW with pointers to MyClass
//buffer.add( item ); // ERROR: 'Buffer<Item>::add' : cannot convert parameter 1 from 'const MyClass' to 'MyClass *const &'
buffer.add( const_cast<MyClass *>( &item ) ); // forcing const_cast WORKS
}
你应该做这样的事情:
Buffer<MyClass const*>
因为 &item on a const MyClass 是 Myclass const* 而不是 MyClass*
您的Buffer
类模板可以被认为是正确的,而您的example2
函数不正确。 我将在此基础上进行。
在example1
中,该函数有一个对MyClass
实例的 const 引用参数。 然后,Buffer
的add
方法复制实例的值,将其放置在自己的内存缓冲区中(我希望Buffer
跟踪所有这些内存)。 因此,example
采用 const 引用的事实与Buffer
无关,因为该值的副本是创建的。
在example2
中,Buffer
的add
方法是获取指向MyClass
实例的指针的副本,并将其存储在自己的内存缓冲区中。 在example2
中,您已将Buffer
实例化为持有指向MyClass
的非常量指针,因此这就是您应该给出的,因此example2
应该是:
void example2( MyClass & item )
{
Buffer<MyClass *> buffer; // NOW with pointers to MyClass
buffer.add( &item );
}
现在,您必须知道,如果要使用buffer
,则item
必须保持固定在内存中,直到您完成它。 而在 example1
中,这些项目可能会消失,因为您已安全地将副本存储在 buffer
中。
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- constexpr构造函数需要常量成员函数时出现问题