Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问嵌套类(行为类似于朋友,但不是朋友)_C++_Class_Instance_Parent Child - Fatal编程技术网

C++ 访问嵌套类(行为类似于朋友,但不是朋友)

C++ 访问嵌套类(行为类似于朋友,但不是朋友),c++,class,instance,parent-child,C++,Class,Instance,Parent Child,没有长时间的延迟,这里的代码我不知道它为什么会这样做: #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&

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

#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::B的实例可以访问A的私有函数A::print?尽管我意识到我可能会误解什么是子类,而不是基类和派生类

嵌套类或内部类可以访问它所嵌套的类的私有类。从某种意义上说,它已经是那个阶级的朋友了。这类似于任何一个物体都可以接触到任何其他物体的隐私

对于在类之外定义的类,您可以使用friend来访问它的私有类。下面是一个简单的例子:

struct B;

class A
{
  int x;
  friend struct B;
};

struct B
{
  void someFunc() {
    A a;
    a.x = 5;
  }
};

int main(int argc, const char* argv[])
{
  B b;
  b.someFunc();
  return 0;
}

如果不让B成为a的朋友,它将无法访问a的成员x。

嵌套类或内部类可以访问它所嵌套的类的隐私。从某种意义上说,它已经是那个阶级的朋友了。这类似于任何一个物体都可以接触到任何其他物体的隐私

对于在类之外定义的类,您可以使用friend来访问它的私有类。下面是一个简单的例子:

struct B;

class A
{
  int x;
  friend struct B;
};

struct B
{
  void someFunc() {
    A a;
    a.x = 5;
  }
};

int main(int argc, const char* argv[])
{
  B b;
  b.someFunc();
  return 0;
}

如果不让B成为a的朋友,它将无法访问a的成员x。

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

标准$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
        }
    };
}

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

标准$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
        }
    };
}

嵌套类无法访问外部类的私有成员。我现在不在计算机前面。对我来说是新的@bash.d:语言已经改变了。在C++03中,嵌套类不被视为访问说明符的成员,但在C++11中,它们与成员函数一样是成员,因此具有与任何成员函数相同的访问权限。我不知道这一点。感谢you@bash.d幼崽。我不知道它变了!嵌套类无法访问外部类的私有成员。我现在不在计算机前面。对我来说是新的@bash.d:语言已经改变了。在C++03中,嵌套类不被视为访问说明符的成员,但在C++11中,它们与成员函数一样是成员,因此具有与任何成员函数相同的访问权限。我不知道这一点。感谢you@bash.d幼崽。我不知道它变了!