簡體   English   中英

正確使用const 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*> 

因為const MyClass上的&item是Myclass const *而不是MyClass *

您的Buffer類模板可以被認為是正確的,並且您的example2函數是不正確的。 我會繼續這樣做。

example1 ,該函數具有一個到MyClass實例的const引用參數。 然后, Bufferadd方法復制實例的值,將其放在自己的內存緩沖區中(我希望Buffer能夠跟蹤所有這些內存)。 因此, example采用const引用這一事實與Buffer無關,因為該值的副本已生成。

example2Bufferadd方法將指針的副本帶到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM