我有这样的结构:
struct A {
B b;
C c;
}
其中c保留对b的引用。我把A放在一个矢量中:
std::vector<A> as;
将新元素推回向量时,它可能会在内存中移动。这会改变b的地址并使c必须b的引用无效。有没有更好的方法来解决这个问题,而不是将b的数据移出结构并保持指向它的指针?
答案 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包含应复制/移动/分配的其他内容,请仅保留引用并仅修改这些成员。