C++尚未构造对象的调用方法
C++ call method of not yet constructed object
上次我被否决了,所以我试图让我的问题更清楚。这是代码:
my_header.h
class A;
class B {
public:
B(A* a);
int GetValue() { return value_; }
private:
int value_;
};
class A {
public:
A() {
b = new B(this);
}
void PrintValue() {
std::cout << "GetValue() called from A::PrintValue() = " << b->GetValue() << "n";
}
private:
B* b;
};
B::B(A* a) : value_(100) {
std::cout << "GetValue() called from B::B(A* a) = " << GetValue() << "n";
a->PrintValue();
}
和 main.cc
#include "my_header.h"
int main() {
A a;
return 0;
}
输出是:
GetValue() called from B::B(A* a) = 100
GetValue() called from A::PrintValue() = 1
我知道调用尚未正确构造的对象的方法是一个非常糟糕的主意。但是我不明白为什么从PrintValue()
返回 1 value_
中调用GetValue()
即使它已经初始化为 100,正如我们从上面的字符串中看到的那样。
>A::b
直到B
的构造函数完成后才会设置为新B
对象的地址。
当B
的构造函数调用a->PrintValue()
时,后者在b
尚未初始化时调用b->GetValue()
。因此,您可以通过访问b
获得未定义的行为。
未定义的行为意味着任何事情都可能发生。正如您所说,A
对象尚未构造,因此使用指向A
对象稍后将位于何处的指针调用PrintValue
会产生废话。不要试图推理它。只是不要这样做。
你乞求和乞求未定义的行为,这就是编译器给你的。 A 未完全构造。 特别是,b
尚未分配,也没有初始化为任何特定内容。 您的程序可能会执行任何操作。
相关文章:
- 在c++中多次调用方法
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 接收字符串并使用它来调用方法C++
- 使用 gmock c++ 在真实对象上调用方法
- 不带预处理器的调用方法/文件的文件名/行号
- JNI从Android调用C++方法
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何使用接口指针调用方法,该指针是其具体类的一部分,而不是接口的一部分
- 从内部类中的方法从包含类调用方法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 为什么派生类的实例从基类调用方法?
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- C++当您取消引用指向类对象的指针,然后将其作为引用返回时,是否可以对此引用调用方法
- 通过模板函数对未知类型调用方法
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 创建一个C++DLL以从C#DLL调用方法
- 如何从qt中的类中调用方法
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法