我有一个类 (A),其中包含另一个类 (B) 的对象列表。在创建 A 类对象时,它会创建 B 类对象的列表,然后调用每个 B 对象的函数。每个 B 对象都存储对创建它们的 A 对象的引用。上述函数通过在 B 对象对对象 A 的引用上调用 get_bs() 来返回 b 对象的列表。根据我在 A 的构造函数中调用 B 对象上的函数的位置,程序要么运行,要么给出错误,我不知道不明白发生了什么变化以及为什么会发生错误。我知道这是垃圾描述,但我不知道如何更好地表达它。
我在运行时收到错误,它指向包含的文件向量中的一行,我不太理解。
这是我可以制作的重现错误的最小代码:
#include <vector>
class A;
class B {
public:
B(A &a) : m_a(a) {}
~B() {}
void func();
B &operator=(const B &b) { return *this; };
private:
A &m_a;
};
class A {
public:
A() {
for (int i = 0; i < 10; i++) {
m_temp_bs.push_back(B(*this));
m_bs.push_back(&m_temp_bs[i]);
m_bs[i]->func(); // fine
}
for (int i = 0; i < 10; i++) {
m_bs[i]->func(); // error ????
}
}
~A() {}
std::vector<B*> get_bs() { return m_bs; }
private:
std::vector<B> m_temp_bs = {};
std::vector<B*> m_bs = {};
};
void B::func() {
std::vector<B*> bs = m_a.get_bs();
}
int main() {
A a = A();
}
此外,当尝试改变方向,在类定义中内联定义
B::func()
时,我在构建时遇到了不同的错误:Use of undefined type 'A'
,我也不明白。我想这两个错误以某种方式联系在一起。
调用堆栈:
[External Code]
main() Line 40
A::A() Line 25
B::func() Line 36
A::get_bs() Line 28
std::vector<B *,std::allocator<B *>>::vector<B *,std::allocator<B *>>(const std::vector<B *,std::allocator<B *>> & _Right) Line 683 (This is in the vector file)
这是发生错误的所述矢量文件的片段:
#endif // _HAS_CXX23 && defined(__cpp_lib_concepts)
_CONSTEXPR20 vector(const vector& _Right)
: _Mypair(_One_then_variadic_args_t{}, _Alty_traits::select_on_container_copy_construction(_Right._Getal())) {
const auto& _Right_data = _Right._Mypair._Myval2;
const auto _Count = static_cast<size_type>(_Right_data._Mylast - _Right_data._Myfirst); // Exception thrown: read access violation.
_Construct_n(_Count, _Right_data._Myfirst, _Right_data._Mylast); // _Right_data was 0xFFFFFFFFFFFFFFF7.
}
我希望 A 和 B 的名称不要太短,以免代码难以阅读。我不知道我该怎么称呼他们。
如果不深入了解我的原始程序的大量细节,我真的不知道如何描述我的目标,我认为这是不合适的。
提前感谢任何提供帮助的人,并对奇怪的代码表示歉意 - 我对 C++ 还很陌生 哦,我对 Stack Exchange 也很陌生,所以如果我问问题的方式有任何问题,请告诉我。
@molbdnilo 向我指出,向量在变大时会重新分配内存,这会使存储在其中的指针无效。事实证明,您只需为向量预分配内存即可,它可以工作 - 我将
m_temp_bs.reserve(10);
添加到 A 构造函数的开头,现在一切都可以工作了。
谢谢大家!