Вектор объектов, содержащих ссылки - PullRequest
2 голосов
/ 10 октября 2011

У меня есть следующая структура:

struct Transaction {
    Transaction(Book& bb, Patron& pp, Date dd)
        : b(bb), p(pp), d(dd) { }
        Book& b;
        Patron& p
        Date d;
};

Когда я пытаюсь поместить объект типа Transaction в vector<Transaction>v_t с push_back, он не будет работать. Скрининг ошибок перерывов проигрывает.

Это потому, что у меня есть ссылки как члены моего объекта?

Ответы [ 4 ]

3 голосов
/ 10 октября 2011

Вам понадобится оператор присваивания и копирования для типа, поскольку он содержит ссылку. Контейнерные объекты STL должны быть копируемыми и назначаемыми (к сожалению, по вашей ссылке это невозможно).

Проверить эту тему:

http://cboard.cprogramming.com/cplusplus-programming/106779-copy-constructor-class-const-reference-member.html

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

2 голосов
/ 10 октября 2011

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

Превратите элементы b, p, d в значения или shared_ptr s.

0 голосов
/ 10 октября 2011

Сообщество вики, потому что это почти наверняка вызывает UB.

Если у вас есть конструктор копирования, вы можете создать оператор присваивания, используя новое размещение:

struct Transaction {
  Transaction(Book& bb, Patron& pp, Date dd)
    : b(bb), p(pp), d(dd) { }

  Transaction(const Transaction & src)
    : b(src.b), p(src.p), d(src.d) { }

  Transaction & operator= (const Transaction & src) {
    if (this != &src) {
      this->~Transaction();
      Foo * copy = new (this) Transaction(src);
      return *copy;
    } else {
      return *this;
    }
  }

  Book& b;
  Patron& p
  Date d;

};

Это может работать с вашим компьютером, с вашим компилятором, с определенными настройками оптимизации. С другой стороны, это не может быть. Или он может внезапно перестать работать, когда ваша операторская система автоматически обновляет библиотеку C ++ ABI. Или же он может внезапно перестать работать, когда вы доставите его своему клиенту, у которого немного другая версия библиотеки C ++ ABI.

Независимо от того, как вы обрезаете, изменение ссылки - неопределенное поведение.

0 голосов
/ 10 октября 2011

STL не работает со ссылками, потому что вы не можете иметь оператор присваивания, который будет назначать ссылку (не копировать).
Вместо этого вы должны использовать указатели, например:

struct Transaction {
    Transaction(Book& bb, Patron& pp, Date dd)
        : b(&bb), p(&pp), d(dd) { }
        Book* b;
        Patron* p
        Date d;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...