0
У меня есть следующий класс.std vector, копирование структуры данных
class Row
{
Table* parent_table;
Row(Table* construct);
}
class Table
{
std::vector<Row>;
}
Я создаю std::vector<Table> test;
, и в цикле я создаю объекты таблицы и оттеснить их на тест-вектор. Проблема в том, что я теряю таблицу * внутри каждой строки. Мне нужен указатель, поэтому, когда я повторяю свои строки, я знаю, к какой таблице они принадлежат.
Есть ли способ заставить std :: vector, а не копировать объекты, когда их отталкивают назад?
«Проблема в том, что я теряю таблицу * внутри каждой строки». Можете ли вы рассказать об этом, что это значит? Похоже на то, о чем должен заботиться соответствующий конструктор-копир. – jrok
Знаете ли вы, что адреса объектов в 'std :: vector
ответ
Вместо того чтобы хранить в вашем
std::vector
, магазинstd::unique_ptr<Row>
илиstd::shared_ptr<Row>
. Они, как правило, достаточны для такого рода вещей (есть более сложные способы, с помощью которых вы можете приблизиться к этому, например, хранить исходные указатели (сложные для обслуживания) или перематывать собственный класс на основеpImpl
или писать собственный смарт-указатель с пользовательской семантикой).unique_ptr
поддерживает только перемещение и, как таковое, позволяет избежать проблемы с копией.shared_ptr
вместо этого поддерживает совместное владение, что, вероятно, вам не нужно. Я бы посоветовал использоватьunique_ptr
.источник
2013-03-13 13:53:13 Yakk
Yeap с использованием общего указателя - лучший вариант –
Push элементы по ссылке или указателю. Вы нажимаете копии, поэтому копирование элемента - это все, что может сделать C++. Я бы лично посоветовал вам использовать вектор указателей, например:
std::vector<Row*>
На самом деле более безопасным и чистым способом было бы хранить shared_ptr-s вместо простых указателей, так что вам не нужно иметь дело с управлением памятью , Что-то вроде:
std::vector<std::shared_ptr<Row> >
источник
2013-03-13 13:51:12
Самым простым решением в этом случае, вероятно, будет хранить итератор в таблицу:
источник
2013-03-13 13:54:22 JSQuareD
'std :: vector
А ты прав ... даже push_back делает итераторы недействительными, если происходит перераспределение. Спасибо за совет – JSQuareD
Вы задаете два несвязанных вопросы. Пожалуйста, не делайте этого в одном сообщении. Один пост - один вопрос. Это облегчает ответ.
ВТОРОЙ:
Другие ответы являются ответом.
ПЕРВЫЙ:
Скорее всего, ваша ROW не содержит никакой обратной ссылки на таблицу, которая содержит ее. Таким образом, когда вы проходите вокруг вектора строк или самой строки, вы теряете информацию о том, кто ее владеет.Вы должны либо передать a-vector-of-rows вместе с
table* owner
, либо строку вместе сtable* owner
, либо вы должны сделать свою строку более интеллектуальной и заставить все строки содержатьtable* owner
(то есть иметь строки, содержащие ссылку на владельца)Конечно, обратная связь может быть любой формы. Он не должен быть указателем. Вы можете пройти
Table&
, ashared_ptr<Table>
, astring tablename
или что-то еще, что поможет вам получить доступ к таблице напрямую или через какого-либо менеджера. Важно то, что либо строка должна содержать это, либо должна быть передана отдельно, но вместе с строками.источник
2013-03-13 13:57:08 quetzalcoatl
Смежные вопросы