正确使用const c ++

时间:2011-05-07 16:29:32

标签: c++ pointers const

我有这个示例代码(下面),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
}

2 个答案:

答案 0 :(得分:4)

您应该执行以下操作:

Buffer<MyClass const*> 

因为const MyClass上的&amp;项是Myclass const *而不是MyClass *

答案 1 :(得分:0)

您的Buffer课程模板可以被认为是正确的,并且您的example2功能不正确。我将继续这样做。

example1中,该函数具有一个MyClass实例的const引用参数。 add的{​​{1}}方法然后复制实例的值,将其放在自己的内存缓冲区中(我希望Buffer跟踪所有这些内存)。因此,Buffer采用const引用这一事实与example无关,因为该值的副本已经生效。

Buffer中,example2的{​​{1}}方法正在获取指向add实例的指针的副本,并将其存储在自己的内存缓冲区中。在Buffer中,您已将MyClass实例化为持有example2的非常量指针,因此您应该提供它,因此Buffer应为:

MyClass

现在,您必须注意,如果要使用example2void example2( MyClass & item ) { Buffer<MyClass *> buffer; // NOW with pointers to MyClass buffer.add( &item ); } 必须在内存中保持固定状态,直到您完成它为止。而在buffer中,由于您已在item中安全地存储副本,因此这些项目可能会消失。