2013-03-13 73 views
0

我有以下类。std向量,复制数据结构

class Row 
{ 
    Table* parent_table; 
    Row(Table* construct); 
} 
class Table 
{ 
    std::vector<Row>; 
} 

我创建std::vector<Table> test;,并且在一个循环中创建表的对象和把它们放回至测试向量。问题是我在每一行中丢失了Table *。我需要指针,所以当我遍历我的行时,我知道它属于哪个表。

有没有办法强制std :: vector,而不是复制对象时,他们被推回来?

+0

”问题是我失去了每行内的表格*。“你能详细说明一下,这是什么意思?听起来像是应该由合适的拷贝构造函数来照顾的东西。 – jrok 2013-03-13 13:56:05

+0

您是否知道'std :: vector

'中的对象地址可以随着'push_back'的变化而变化?如果你需要对象的地址是稳定的,你不能直接将它们直接存储在'std :: vector'中。下面的答案也适用于'std :: vector
' - 存储'std :: vector >'。 – Yakk 2013-03-13 13:57:54

回答

4

代替存储在std::vector,商店std::unique_ptr<Row>std::shared_ptr<Row>。这些对于这类事情来说已经足够了(有更复杂的方法可以处理这个问题,例如存储原始指针(复杂维护)或者滚动自己的类,或者使用自定义语义编写自己的智能指针)。

unique_ptr只支持移动,因此避免了您的复制问题。 shared_ptr反而支持共享所有权,这可能是您不需要的东西。我建议使用unique_ptr

+0

Yeap使用共享指针更好选项 – 2013-03-13 13:53:53

1

通过引用或指针推送元素。您正在推送副本,以便复制元素是C++所能做的。我个人建议你使用像这样的指针向量:std::vector<Row*>

实际上,一个更安全和更清洁的方法是存储shared_ptr -s而不是裸指针,这样就不必处理内存管理。喜欢的东西:

std::vector<std::shared_ptr<Row> >

0

在这种情况下,最简单的解决办法可能是一个迭代器存储到您的表:

class Row 
{ 
    std:vector<Table>::iterator parent_table; 
    Row(std:vector<Table>::iterator construct); 
} 
+2

'std :: vector

:: iterator'很容易失效。我建议不要存储这样的迭代器,除非你知道所有'std :: vector'迭代器失效规则并且可以保证它们永远不会发生。 – Yakk2013-03-13 13:55:46

+0

啊,你是对的......即使push_back无效迭代器,如果重新分配发生。谢谢你的提示 – JSQuareD 2013-03-13 13:57:34

1

你问两个不相关的问题。请不要在一个帖子中这样做。一个后一个问题。这使得回答更容易。

第二:

有没有办法强制的std ::载体,而不是当他们被推回到复制对象?

已被其他人回答。

FIRST:

创建一个std ::向量测试,和在一个循环中创建表的对象和把它们放回至测试向量。问题是我失去了Table里面的Row *表。我需要指针,所以当我遍历我的行时,我知道它属于哪个表。

很可能您的ROW不包含对包含它的表的任何反向引用。这样,当你传递行向量或行本身时,就会丢失关于谁拥有它的信息。您必须将table* owner以及table* owner之间的一行连同table* owner一起传递给行,或者您必须使行更加智能并强制所有行包含table* owner(也就是说,让行包含对所有者的反向引用)

当然,反向引用可能是任何形状。它不需要是一个指针。您可以通过Table&shared_ptr<Table>string tablename或任何可以帮助您直接或通过某个经理访问表的内容。重要的是,Row必须包含它,或者它必须单独传递,但与行一起传递。 “