2017-01-22 11 views
2

Чтобы изучить C++, я программирую игру. В этой игре могут быть два игрока. Эти игроки могут подключаться друг к другу с помощью сокетов. После добавления вектора с уникальными указателями в заголовок проигрывателя я получил ошибку: «Ошибка C2280» std :: unique_ptr> :: unique_ptr (const std :: unique_ptr < _Ty, std :: default_delete < _Ty >> &) ': попытка для ссылки на удаленную функцию ". Такая же ошибка для векторов здания.Почему я получил сообщение об ошибке «Попытка ссылаться на удаленную функцию» после добавления вектора с уникальными указателями в мой заголовочный файл?

Чтобы дать более четкое представление о том, что проблема, я установил мой файл заголовка в блоке кода ниже:

class Player { 
public: 
    Player() {} 
    Player(const std::string& name) : _name {name} {} 

    std::string get_name() const { return _name; } 
    void set_name(const std::string & new_name) { _name = new_name; } 

    const bool compare_name(const std::string & name) const; 
    void set_coins(const int coins); 
    const int get_coins(); 
    void set_king(const bool king); 
    const bool get_king(); 

private: 
    std::string _name; 
    int _coins; 
    bool _is_king; 

    std::vector<std::unique_ptr<Building>> _buildings; 
    std::vector<std::unique_ptr<Building>> _placed_buildings; 
    std::vector<std::unique_ptr<Character>> _characters; 
}; 

Последние три вектора являются векторами, которые я пытался добавить к моему файл заголовка. Я добавил их в другой класс аналогичным образом. И в этом классе это не привело к ошибке. Но в моем заголовочном файле моего плеера. Не могли бы вы помочь мне решить эту проблему?

Вся помощь будет оценена по достоинству.


Edit: попытка объяснить, почему этот вопрос не является дубликатом.

Это может быть дубликатом, но сейчас, насколько я могу видеть, что в этом вопросе: «Why can I not push_back a unique_ptr into a vector?» кто-то пытается вызвать функцию push_back без использования зЬй :: двигаться в push_back. На данный момент я не пытаюсь вкладывать ценности в свой вектор. То, что я хочу, - это вектор уникальных указателей внутри моего заголовка. Поэтому я пока не пытаюсь заполнить векторы элементами. Поэтому я склонен думать, что пока невозможно использовать std :: move для векторов здания и символа. Я знаю, что эта ошибка часто возникает, когда вы не вызываете функцию std :: move, потому что я смотрел на другие записи StackOverflow. Но ни один из них, похоже, не имеет правильного ответа на мой вопрос. Потому что ответ на большинство из них: используйте «std :: move» или используйте «конструктор по умолчанию», и это не решило мою проблему.

Мое предположение, что это связано с тем, что игрок определяется как shared_ptr, а игрок - это контейнер для векторов, который может быть частью проблемы?

+0

Vectors сделать много копий. 'unique_ptr' не может быть скопирован, потому что это разрушает всю уникальную вещь. Вероятно, вам придется использовать 'std :: move'. – user4581301

+0

@ user4581301 Я склонен думать, что это не проблема. Я просто добавил вектор в свой заголовок. Я не использовал вызов метода и не пытался заполнить его элементами. Я получил ошибку, когда я разместил вектор внутри заголовка. Если я прав, тогда нет места, где я мог бы использовать std :: move для вектора, или я мог бы использовать его где-то еще? – user3473161

+2

Нужна [mcve], чтобы помочь вам. [Я не могу воспроизвести то, что вы предоставили.] (Http://ideone.com/UUocBe) Дайте нам с чем работать, и я проголосую, чтобы разблокировать, предполагая, что MCVE каким-то образом не подтверждает дубликат. – user4581301

ответ

2

Скорее всего, вы копируете объект Player где-то, который по умолчанию копирует элемент для каждого поля. Вы не можете скопировать вектор уникальных указателей

2

Если в классе нет конструктора копирования, компилятор предоставит по умолчанию (вместе с оператором присваивания). Этот конструктор копии по умолчанию попытается скопировать члены класса, включая вектор уникальных указателей в этом случае.

Нужно сделать класс явно нон Copyable:

Player(const Player&) = delete; 
Player& operator =(const Player&) = delete; 

 Смежные вопросы

  • Нет связанных вопросов^_^