正确使用常量 c++

Correct use of const c++

本文关键字:常量 c++      更新时间:2023-10-16

我有这个示例代码(下面),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 引用参数。 然后,Bufferadd方法复制实例的值,将其放置在自己的内存缓冲区中(我希望Buffer跟踪所有这些内存)。 因此,example 采用 const 引用的事实与Buffer无关,因为该值的副本是创建的。

example2中,Bufferadd方法是获取指向MyClass实例的指针的副本,并将其存储在自己的内存缓冲区中。 在example2中,您已将Buffer实例化为持有指向MyClass的非常量指针,因此这就是您应该给出的,因此example2应该是:

void example2( MyClass & item )
{
    Buffer<MyClass *> buffer; // NOW with pointers to MyClass
    buffer.add( &item );
}

现在,您必须知道,如果要使用buffer,则item必须保持固定在内存中,直到您完成它。 而在 example1 中,这些项目可能会消失,因为您已安全地将副本存储在 buffer 中。