2

我有一个这样的结构:

struct A {
    B b;
    C c;
}

其中 c 保留对 b 的引用。我将 A 保留在向量中:

std::vector<A> as;

当将新元素推回向量中时,它可能会在内存中移动。这会改变 b 的地址并使 c 对 b 的引用无效。有没有比将 b 的数据移出结构并保留指向它的指针更好的方法来解决这个问题?

4

2 回答 2

0

您可能在 A 中有一个副本(在 c++11 中移动)构造函数,它使用对 B 的正确引用来初始化 C。

编辑:添加示例

class B { /*stuff*/};
class C {
public:
    explicit C(B& b) : b(&b) {}
private:
    B* b;
};

struct A {
    A() : b(), c(b) {}
    A(const A& rhs) : b(rhs.b), c(b) {
        // Do other needed copy
    }

    B b;
    C c;
};
于 2013-08-17T12:36:46.183 回答
0

当向量重新分配内存时,它会构造对象的副本并销毁旧对象(使用复制或移动构造函数)。

由于 A、B、C 不再可以简单地初始化(该引用需要一些特定于类的逻辑才能正确设置),因此您需要提供代码来执行此操作。

struct B {};
struct C {
  B& b_;

  C() = delete; // in C++11, or just declare but don't implement
  explicit C(B& b) : b_(b) {}
};
struct A {
  B b;
  C c;
  A() : c(b) {}
  A(A const &other) : b(other.b), c(b) {}
  A& operator= (A const &other) {
    b=other.b;
    // c already refers to the correct b ...
    return *this;
  }
};

请注意,除了引用之外,此 C 没有其他成员。如果您的 C 包含复制/移动/分配的其他内容,则只需保留引用并仅修改这些成员。

于 2013-08-17T13:01:50.560 回答