вставка объекта с полями const в контейнер - PullRequest
0 голосов
/ 15 декабря 2011

Предположим, у меня есть:

class A {
public:
    const int x;
    A() : x(3) {}
}

И я хотел бы создать

std::vector<A>

g ++ жалуется, что оператор присваивания по умолчанию не будет работать, поскольку он пытается сделать this->x = x, что нельзя сделать, поскольку x является постоянным.Есть ли способ обойти это?

Ответы [ 3 ]

5 голосов
/ 15 декабря 2011

g ++ жалуется, что оператор присваивания по умолчанию не будет работать, поскольку он пытается это сделать -> x = x, что невозможно сделать, поскольку x является постоянным.

g ++жалуется правильно.Ваш класс не удовлетворяет копируемым требованиям стандартных контейнеров, поэтому вы не можете использовать его с ними.

Есть ли способ обойти это?

Конечно, есть.Даже более чем одним способом.

Например, самая очевидная вещь: вы можете удалить квалификаторы const из членов, чтобы сделать класс копируемым.

Или иначе вы можете хранить указатели (или умные указатели)к контейнерам вместо объектов (один конкретный способ сделать это - то, что предложил tpg2114).

1 голос
/ 15 декабря 2011

Я думаю, что мораль этой истории в том, что если вы хотите, чтобы ваш объект был назначаемым для копирования, не делайте его не назначаемым для копирования, имея const или & members или непубличный оператор назначения копирования.

Edit:

Для справки: С C ++ 11 вы можете emplace в стандартные контейнеры, что одновременно более эффективно и позволяет помещать некопируемые объекты в стандартные контейнеры.

1 голос
/ 15 декабря 2011

Вы пытались использовать что-то вроде boost :: ptr_vector? Вы будете хранить указатель на объект вместо объекта, но это решает проблему присваивания.

http://www.boost.org/doc/libs/1_48_0/libs/ptr_container/doc/ptr_vector.html

...