0
我有以下类。std向量,复制数据结构
class Row
{
Table* parent_table;
Row(Table* construct);
}
class Table
{
std::vector<Row>;
}
我创建std::vector<Table> test;
,并且在一个循环中创建表的对象和把它们放回至测试向量。问题是我在每一行中丢失了Table *。我需要指针,所以当我遍历我的行时,我知道它属于哪个表。
有没有办法强制std :: vector,而不是复制对象时,他们被推回来?
”问题是我失去了每行内的表格*。“你能详细说明一下,这是什么意思?听起来像是应该由合适的拷贝构造函数来照顾的东西。 – jrok 2013-03-13 13:56:05
您是否知道'std :: vector
回答
代替存储在
std::vector
,商店std::unique_ptr<Row>
或std::shared_ptr<Row>
。这些对于这类事情来说已经足够了(有更复杂的方法可以处理这个问题,例如存储原始指针(复杂维护)或者滚动自己的类,或者使用自定义语义编写自己的智能指针)。unique_ptr
只支持移动,因此避免了您的复制问题。shared_ptr
反而支持共享所有权,这可能是您不需要的东西。我建议使用unique_ptr
。来源
2013-03-13 13:53:13 Yakk
Yeap使用共享指针更好选项 – 2013-03-13 13:53:53
通过引用或指针推送元素。您正在推送副本,以便复制元素是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 2013-03-13 13:57:34
你问两个不相关的问题。请不要在一个帖子中这样做。一个后一个问题。这使得回答更容易。
第二:
已被其他人回答。
FIRST:
很可能您的ROW不包含对包含它的表的任何反向引用。这样,当你传递行向量或行本身时,就会丢失关于谁拥有它的信息。您必须将
table* owner
以及table* owner
之间的一行连同table* owner
一起传递给行,或者您必须使行更加智能并强制所有行包含table* owner
(也就是说,让行包含对所有者的反向引用)当然,反向引用可能是任何形状。它不需要是一个指针。您可以通过
Table&
,shared_ptr<Table>
,string tablename
或任何可以帮助您直接或通过某个经理访问表的内容。重要的是,Row必须包含它,或者它必须单独传递,但与行一起传递。 “来源
2013-03-13 13:57:08 quetzalcoatl
相关问题