首页 > 解决方案 > 私有嵌套类访问外部类的私有函数

问题描述

我的代码的简化版本

class Outer
{
private:
    double Foo(double a=0; double b=1);

    class Inner
    {
    public:
        Inner()
        {
            mX = Foo(2, 3);
        }
    private:
        double mX;
    };
};

我的问题是,Inner 无法访问 Foo 函数。我环顾了各个网站,了解需要做什么。我在一页上看到使用friend关键字可能很有用,但我似乎无法正确应用它。

由于我的其余代码的结构方式,我想将 Inner 类保留在 Outer 中。

我不认为这是另一个问题的副本,但如果我错了,我深表歉意。

感谢您的任何建议!

标签: c++oopinner-classes

解决方案


一些错误:

double Foo(double a=0; double b=1);

;不是函数参数之间的分隔符,,而是使用。

mX = Foo(2, 3);

Foo是非静态函数,这意味着它与对象接口相关。如果不指定它与哪个对象相关,则不能调用它。
要修复它,您可以创建一个对象并调用相关对象的此函数,或者将此函数设为静态函数。

创建对象的示例:

class Inner {
public:
    Inner() {
        Outer o; // Consider making it a class member object, so in each call / use it will relate to the same one. Be aware that in this case you will need to use a pointer to the outer class, due to 'incomplete type' error.
        mX = o.Foo(2, 3);
    }
private:
    double mX;
};

使其成为静态函数的示例:

class Outer {
private:
    static double Foo(double a=0, double b=1);

    class Inner {
    public:
        Inner() {
            mX = Outer::Foo(2, 3);
        }
    private:
        double mX;
    };
};

在静态函数的情况下,还请考虑以下赋予 mX 其值的方法Foo

class Inner {
public:
    Inner() {}
private:
    double mX = Outer::Foo(2, 3); // Recommended by Cpp guidelines.
};

或者:

class Inner {
public:
    Inner() : mX(Outer::Foo(2, 3)) {} // Using initialize list

private:
    double mX;
};


参考:
C++ 核心指南


推荐阅读