[英]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*>
因为const MyClass上的&item是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
,因此这些项目可能会消失。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.