Закрытый вложенный класс для доступа к закрытой функции внешнего класса - PullRequest
0 голосов
/ 10 марта 2020

Упрощенная версия моего кода

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 из-за структуры моего остального кода.

Не думаю, что это копия другого вопроса, но если Я ошибаюсь, мои извинения.

Спасибо за любой совет!

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Некоторые ошибки:

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

; не является разделителем между параметрами функции, вместо этого используйте ,.

mX = Foo(2, 3);

Foo не указано c функция, которая означает, что это связано с интерфейсом объекта. Вы не можете вызвать его, не указав, к какому объекту он относится.
Чтобы исправить это, вы можете как создать объект, так и вызвать эту функцию связанного объекта, или сделать эту функцию устаревшей c.

Пример создания объекта:

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

Пример создания функции stati c:

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 его значения, в случае stati c function 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 ++ Основные рекомендации

1 голос
/ 10 марта 2020

Outer::Foo - функция-член c, не относящаяся к состоянию; вам нужен экземпляр 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;
    };
};
...