我有下面的课程。
class Row
{
Table* parent_table;
Row(Table* construct);
}
class Table
{
std::vector<Row>;
}我创建了一个std::vector<Table> test;,然后在一个循环中创建了表对象,并将它们推回到测试向量。问题是我在每一行中丢失了Table*。我需要指针,这样当我遍历我的行时,我就知道它们属于哪个表。
有没有办法强制std::vector在对象被推回时不复制它们?
发布于 2013-03-13 21:53:14
不是在std::vector中存储Row,而是存储std::unique_ptr<Row>或std::shared_ptr<Row>。对于这类事情,这些往往就足够了(还有更复杂的方法可以实现这一点,比如存储原始指针(维护起来很复杂),或者滚动您自己的基于pImpl的类,或者编写您自己的带有自定义语义的智能指针)。
unique_ptr只支持移动,因此可以避免复制问题。相反,shared_ptr支持共享所有权,这可能是您不需要的。我建议使用unique_ptr。
发布于 2013-03-13 21:51:12
通过引用或指针推送元素。您正在推送副本,因此复制元素是C++所能做的全部工作。我个人建议您使用这样的指针向量:std::vector<Row*>
实际上,一种更安全、更干净的方法是存储shared_ptr-s,而不是裸指针,这样您就不必处理太多内存管理问题。类似于:
std::vector<std::shared_ptr<Row> >
发布于 2013-03-13 21:57:09
你在问两个不相关的问题。请不要在一篇文章中这样做。一个帖子-一个问题。这使得回答问题变得非常容易。
第二:
有没有办法强制std::vector在对象被推回时不复制它们?
已经被其他人回答了。
首先:
我创建了一个std::vector测试;,然后在一个循环中创建表对象并将它们推回到test vector。问题是我丢失了Table* I I。我需要指针,这样当我遍历我的行时,我就知道它们属于哪个表。
很可能您的行不包含对包含它的表的任何反向引用。这样,当您传递行向量或行本身时,就会丢失有关谁拥有它的信息。您必须将行向量与table* owner一起传递,或者将行与table* owner一起传递,或者必须使行更智能并强制所有行都包含table* owner (即,使行包含对所有者的反向引用)。
当然,反向引用可以是任意形状的。它不需要是一个指针。您可以传递Table&、shared_ptr<Table>、string tablename或任何可以帮助您直接或通过某个管理器访问表的内容。重要的是,Row必须包含它,或者它必须单独传递,但必须与行一起传递。
https://stackoverflow.com/questions/15387231
复制相似问题