0

我有以下课程。

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

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

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

4

4 回答 4

4

而不是存储Row在 your std::vector, storestd::unique_ptr<Row>std::shared_ptr<Row>. 对于这类事情,这些往往就足够了(有更复杂的方法可以解决这个问题,例如存储原始指针(维护复杂)或滚动您自己的pImpl基于类,或使用自定义语义编写您自己的智能指针)。

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

于 2013-03-13T13:53:13.597 回答
1

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

实际上,更安全和更清洁的方法是存储 shared_ptr-s 而不是裸指针,这样您就不必处理那么多内存管理。就像是:

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

于 2013-03-13T13:51:12.487 回答
1

你在问两个不相关的问题。请不要在一篇文章中这样做。一篇文章 - 一个问题。这使得回答变得非常容易。

第二:

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

已经被别人回答了。

第一的:

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

很可能您的 ROW 不包含对包含它的表的任何反向引用。这样,当您传递行向量或行本身时,您会丢失有关谁拥有它的信息。您必须将 a-vector-of-rows 与 一起传递table* owner,或者将一行与一起传递table* owner,或者您必须使您的 Row 更加智能并强制所有 Rows 包含 a table* owner(即,让 Rows 包含对所有者的反向引用)

当然,反向引用可以是任何形状。它不需要是指针。您可以通过Table&、 a shared_ptr<Table>、 astring tablename或任何可以帮助您直接或通过某个管理器访问表的方法。重要的是,要么 Row 必须包含它,要么它必须单独传递但与行一起传递。

于 2013-03-13T13:57:08.663 回答
0

在这种情况下,最简单的解决方案可能是将迭代器存储到您的表中:

class Row
{
    std:vector<Table>::iterator parent_table;
    Row(std:vector<Table>::iterator construct);
}
于 2013-03-13T13:54:22.507 回答