我有一个程序,需要在类的 (A) 构造函数中创建一个类 (B),并引用将其传递到其 (B) 构造函数的类 (A)。我知道这是垃圾描述,但我不知道如何更好地表达它。
我在运行时收到错误,它指向 B 的构造函数,其中对 A 的引用被分配给变量。
这是我可以制作的重现错误的最小代码:
class A;
class B {
public:
B();
B(A &a);
~B();
private:
A *m_a;
};
class A {
public:
A();
A(int x);
~A();
private:
B m_b;
};
B::B() {}
B::B(A &a) {
*m_a = a; // Exception thrown: write access violation.
} // this->m_a was 0x7FF895E32BB3.
B::~B() {}
A::A() {}
A::A(int x) {
m_b = B(*this);
}
A::~A() {}
int main() {
A temp = A(10);
}
我尝试添加和删除默认构造函数,并且尝试仅为
m_b = B(*this)
行创建一个单独的函数,因为与此类似的其他帖子似乎表明 *this
不起作用,因为对象 *this
指的是尚未完全完成。
调用堆栈:
[External Code]
main() Line 40
A::A(int x) Line 32
B::B(A & a) Line 24
我希望 A 和 B 的名称不要太短,以免代码难以阅读。我不知道我该怎么称呼他们。
如果不深入了解我的原始程序的大量细节,我真的不知道如何描述我的目标,我认为这是不合适的。
提前感谢任何提供帮助的人,并对奇怪的代码表示歉意 - 我对 C++ 还很陌生
*m_a = a;
这需要现有指针
m_a
,并且对象a
被分配给m_a
已经指向的任何东西。
不幸的是,这个m_a
是一个完全未初始化的指针,它是随机垃圾,并且包含未定义的行为。
目前尚不清楚所显示代码的确切意图是什么。也许这里的目的是将设置m_a
到
a
的地址,或者m_a=&a;
在 C++ 中使用指针时,了解指针和它们指向的对象是
不同的、独立的实体,这一点很重要。每一个都可以分配给,了解根本差异很重要。 这应该解决这里立即未定义的行为,但是这种总体方法有点容易出错,并且通常会导致其他地方出现未定义的行为,但就崩溃的原因而言,就是这样。