gpt4 book ai didi

c++ - 访问嵌套类(表现得像 friend ,但又不是)

转载 作者:行者123 更新时间:2023-11-30 02:00:47 24 4
gpt4 key购买 nike

没有很长时间的延迟,这里的代码我不知道它为什么会这样做:

#include <iostream>

class A {
private:
void print() { std::cout << "A.print() called" << std::endl; };
public:
template<typename Foo>
class B; //NOTE: no friend!
public:
A();
B<double>* bd;
B<int>* bi;
};

template<typename Foo>
class A::B{
A* callback;
public:
B(A* a):callback(a){};
void print() { callback->print(); }; // Why is this working ???
};

A::A():bd(new B<double>(this)),bi(new B<int>(this)){}

int main(int argc, char **argv)
{
A a;
// a.print(); // error: ‘void A::print()’ is private
a.bd->print();
a.bi->print();

A::B<char> c(&a);
c.print();

A::B<double> d = *a.bd;
d.print();

return 0;
}

好吧,它创建了这个输出:

A.print() called
A.print() called
A.print() called
A.print() called

但为什么呢?

背景

当我遇到一个与 friend 有关的问题时,我开始了我的冒险之旅。所以我读了friend declaration not forward declaring (以及提到的答案 herehere )。因此,在尝试设置一个简单示例(您在上面看到的结果)时,我发现我实际上似乎根本不需要 friend

问题

所以这是底线问题:为什么 A::B 的实例可以访问 A 的私有(private)函数 A: :print()?(虽然我意识到我可能会误解 my children 是什么——children 而不是 base vs. 派生)

最佳答案

因为嵌套类是封闭类的成员

标准 $11.7.1

“嵌套类是一个成员,因此具有与任何其他成员相同的访问权限。封闭类的成员对嵌套类的成员没有特殊访问权限;应遵守通常的访问规则”

通常的访问规则规定:

“类的成员也可以访问该类有权访问的所有名称……”

标准中已经给出了具体的例子:

class E {
int x;
class B { };

class I {
B b; // OK: E::I can access E::B
int y;
void f(E* p, int i) {
p->x = i; // OK: E::I can access E::x
}
};
}

关于c++ - 访问嵌套类(表现得像 friend ,但又不是),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14758881/

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