我有一个这样的结构:
struct A {
B b;
C c;
}
其中 c 保留对 b 的引用。我将 A 保留在向量中:
std::vector<A> as;
当将新元素推回向量中时,它可能会在内存中移动。这会改变 b 的地址并使 c 对 b 的引用无效。有没有比将 b 的数据移出结构并保留指向它的指针更好的方法来解决这个问题?
您可能在 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;
};
当向量重新分配内存时,它会构造对象的副本并销毁旧对象(使用复制或移动构造函数)。
由于 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 包含应复制/移动/分配的其他内容,则只需保留引用并仅修改这些成员。