gpt4 book ai didi

c++ - 在不显式传递实例的情况下从内部类访问外部类

转载 作者:行者123 更新时间:2023-11-28 01:19:25 25 4
gpt4 key购买 nike

以下代码产生输出

outer::inner::inner, o=00000000
outer
outer::inner::val, o=00000000
outer::print

谁能解释我如何通过 o 访问外部类方法 print 而无需在构造时显式分配 o 的值?

这里 o 为空,但我仍然可以调用它的方法。

我已经使用 MSVC 2017 和 g++ 7.4.0 对此进行了测试,输出是相同的。

#include <iostream>

class outer {
public:
outer() {
std::cout << __func__ << std::endl;
}

class inner {
outer *o = nullptr;
public:
inner() {
std::cout << __FUNCTION__ << ", o=" << o << std::endl;
}
void val() {
std::cout << __FUNCTION__ << ", o=" << o << std::endl;
o->print(); // **call outer class method**
}
};

inner i;

void print() {
std::cout << __FUNCTION__ << std::endl;
}
};

int main()
{
outer o;
o.i.val();

return 0;
}

最佳答案

您可以将示例简化为

struct S
{
void f() { std::cout << "hello world\n"; }
};

int main()
{
S* s = nullptr;
s->f();
}

取消引用 nullptr 是 UB。所以任何事情都有可能发生。

为什么它看起来有效?

因为在实践中,方法函数通常被实现为好像有带有额外参数的常规函数​​:

void S::f() -> void f(S*)(或 void f(S&))

因此,代码变为:

void f(S* /*unused*/) { std::cout << "hello world\n"; }

int main()
{
S* unused = nullptr;
f(unused);
}

在这种情况下,编译器将 UB 转换为有效代码,因为未使用 unused,它不会崩溃并执行您期望的操作。

关于c++ - 在不显式传递实例的情况下从内部类访问外部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57235002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com