【问题标题】:Private nested class accessing private function of outer class私有嵌套类访问外部类的私有函数
【发布时间】:2020-03-10 01:22:17
【问题描述】:

我的代码的简化版

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++ oop inner-classes


【解决方案1】:

一些错误:

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;
    };
};

在静态函数Foo 的情况下,还可以考虑以下方式为 mX 赋予其值:

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++ Core Guidelines

【讨论】:

    【解决方案2】:

    Outer::Foo 是一个非静态成员函数;您需要调用Outer 的实例,内部类没有隐式(如java)。例如

    class Outer
    {
    private:
        double Foo(double a=0; double b=1);
    
        class Inner
        {
        public:
            Inner()
            {
                Outer o;
                mX = o.Foo(2, 3);
            }
        private:
            double mX;
        };
    };
    

    【讨论】:

    • 我知道这很简单。感谢您的帮助和快速响应,出于好奇,鉴于我有一个 Outer 实例,我将如何访问 Outer 的私有成员变量。再说一次,我敢肯定,这很简单。
    • @T.Smith 我可能无法正确回答您的问题;在Inner 中,如果您有Outer 的实例,您可以直接访问Outerprivate 成员,如我的回答所示。
    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 2014-05-31
    • 2014-12-29
    • 2018-07-13
    • 2016-08-04
    • 2021-01-05
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多