Я пишу класс, где несколько экземпляров связаны друг с другом, как связанный список. Вот скелетный пример соответствующего кода:Const-correctness со связанным списком
class A
{
public:
void setNext(const A& node) { next = &node; }
const A& getNext() const { return *next; }
private:
const A* next;
}
Я объявил аргумент setNext
как const
, потому что node
не изменяется setNext
. Класс А также не изменяет следующий узел, поэтому переменная-член next
объявлена const
. Проблема возникает с getNext
. Независимо от того, какой объект получает следующий узел из текущего узла, очень может потребоваться изменить узел, но поскольку переменная-член const
, возвращаемая ссылка должна быть также const
.
Из того, что я читал, const_cast
обычно указывает на плохой дизайн, но мне кажется, что мне нужно будет использовать его либо внутри объекта, который получает следующий узел, либо использует его в классе A для возврата неконстантной ссылки , Является ли это допустимым использованием const_cast
или есть ли какой-то недостаток в моем проекте?
И пока мы по этому вопросу, есть ли предпочтение в той или иной форме, следует ли возвращать ссылку или указатель? У меня есть setNext
возьмите ссылку, чтобы убедиться, что я получаю действительный экземпляр A, но возвращаемое значение может быть возвращено в любом случае.
Я бы сказал, что так как А в 'getNext' предназначаются, чтобы позволить другим изменить возвращаемые object, то A облегчает модификацию своего «следующего» объекта, тогда член 'next' должен * not * быть' const'. То, как я это вижу, не имеет значения, изменит ли A '' next'' или позволяет другим это делать; в любом случае, что '* next' не остается постоянным, через этот конкретный указатель. – yzt