将事物保存在向量中会使内部引用无效,如何解决?

时间:2013-08-17 12:19:56

标签: c++ struct

我有这样的结构:

struct A {
    B b;
    C c;
}

其中c保留对b的引用。我把A放在一个矢量中:

std::vector<A> as;

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

2 个答案:

答案 0 :(得分: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;
};

答案 1 :(得分: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包含复制/移动/分配的其他内容,请仅保留引用并仅修改这些成员。