Как вызывать функции внешнего класса с тем же именем, что и вызывающая функция внутреннего класса - PullRequest
0 голосов
/ 11 июля 2020

Название говорит само за себя. Предположим, у меня есть это:

struct Outer
{
    struct Inner
    {
        void a(int i) {
            Outer::a(i); // Error: Illegal of non-static member function
        }
    };

    void a(int i) {}
};

Каким будет это объявление Inner::a?

Ответы [ 3 ]

2 голосов
/ 11 июля 2020

Нет возможности. Нет даже фиксированного отношения между внешним и внутренним классами (например, агрегация), вы можете создавать внутренние экземпляры без внешних экземпляров и наоборот.

Кстати: тот факт, что обе функции-члены называются a здесь совершенно неуместен.

0 голосов
/ 11 июля 2020

Если вы пришли из java, объявление в C ++

class Outer { 
  class Inner {
  };
};

означает, что в java:

 class A {
   static class B {   // <- static class
   };
 };

все внутренние классы в C ++ являются своего рода «эквивалентами» static внутренние классы в java

0 голосов
/ 11 июля 2020

Как вызывать функции внешних классов с тем же именем, что и вызывающая функция внутреннего класса?

Вам необходимо создать экземпляр класса перед попыткой для прямого доступа к функциям-членам.

Таким образом, есть два способа сделать это:

  1. Объявить сигнатуру функции с помощью static.

  2. Создайте экземпляр Outer и получите доступ к функции-члену с помощью оператора точки.

Пример 1:

struct Outer {
    struct Inner {
        void a(int i) {
            Outer::a(i); // direct member function access
        }
    };

    static void a(int i) { // declared as static
        std::cout << i << std::endl;
    }
};

int main(void) {
    Outer::Inner in;

    in.a(10); // Inner class calls the member of Outer class's a(int)

    return 0;
}

Пример 2:

struct Outer {
    struct Inner {
        void a(int i) {
            Outer x;    // instance to the class Outer
            x.a(i);     // accessing the member function
        }
    };

    void a(int i) {     // outer class definition
        std::cout << i << std::endl;
    }
};

int main(void) {
    Outer::Inner in; // creating an instance of Inner class

    in.a(10); // accessing the Inner member function (which accesses
              // Outer class member function)

    return 0;
}
...