Правильное использование const c ++ - PullRequest
1 голос
/ 07 мая 2011

У меня есть этот пример кода (ниже), метод example1 () работает без проблем, example2 () похож, но я должен заставить const_char сделать его компиляцией, хотя я считаю, что метод example1 () не нужен, example2 () тоже не понадобится.

Мой вопрос: как я могу изменить метод add (), чтобы компилировать оба, или как я должен правильно вызывать buffer.add () в example2 (), не вызывая 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 ]

4 голосов
/ 07 мая 2011

Вы должны сделать что-то вроде:

Buffer<MyClass const*> 

, потому что & item на const MyClass - это Myclass const *, а не MyClass *

0 голосов
/ 07 мая 2011

Ваш шаблон класса Buffer можно считать правильным, и это ваша функция example2, которая является неправильной. Я продолжу на этом основании.

В example1 функция имеет константный параметр ссылки на экземпляр MyClass. Затем add метод Buffer создает копию значения экземпляра, помещая его в свой собственный буфер памяти (надеюсь, Buffer отслеживает всю эту память). Поэтому тот факт, что example принимает константную ссылку, не имеет отношения к Buffer, так как создается копия значения.

В example2 метод add для Buffer берет копию указателя на экземпляр MyClass и сохраняет его в своем собственном буфере памяти. В example2 вы указали, что Buffer содержит неконстантные указатели на MyClass, так что вы должны его указывать, поэтому example2 должно быть:

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

Теперь вы должны знать, что, если использовать buffer, item должен оставаться фиксированным в памяти, пока вы не закончили с ним. Принимая во внимание, что в example1 элементы могут исчезнуть, поскольку вы благополучно сохранили копии в buffer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...