嵌套类成员函数无法访问封闭类的功能.为什么?

Rah*_*hul 19 c++ nested-class

请参阅下面的示例代码:

class A
{
private:
    class B
    {
    public:
        foobar();
    };
public:
    foo();
    bar();
};
Run Code Online (Sandbox Code Playgroud)

在A&B级实施中:

A::foo()
{
    //do something
}

A::bar()
{
    //some code
    foo();
    //more code
}

A::B::foobar()
{
    //some code
    foo(); //<<compiler doesn't like this
}
Run Code Online (Sandbox Code Playgroud)

编译器在方法foobar()中标记对foo()的调用.早些时候,我把foo()作为A类的私有成员函数,但是改为public,假设B的函数看不到它.当然,它没有帮助.我试图重新使用A的方法提供的功能.为什么编译器不允许这个函数调用?在我看来,它们是同一个封闭类(A)的一部分.我认为嵌套类meebers在C++标准中封闭类的可访问性问题已得到解决.

如果不重写B的相同方法(foo()),保持B嵌套在A中,我怎样才能实现我想做的事情?

我使用的是VC++编译器ver-9(Visual Studio 2008).谢谢您的帮助.

Geo*_*che 21

foo()是一个非静态成员函数,A你试图在没有实例的情况下调用它.
嵌套类B是一个单独的类,只具有一些访问权限,并且对现有实例没有任何特殊知识A.

如果B需要访问,A你必须给它一个引用,例如:

class A {
    class B {
        A& parent_;
    public:
        B(A& parent) : parent_(parent) {}
        void foobar() { parent_.foo(); }
    };
    B b_;
public:
    A() : b_(*this) {}
};
Run Code Online (Sandbox Code Playgroud)

  • +1,只是一个挑剔 - "父"可能不是这里成员变量的最佳名称 - 容易与继承混淆. (5认同)
  • 我只是想提一下,嵌套类 B 引用类 A 有一个很好的设计原因。 (2认同)