вложенный класс как параметр для функции-члена в C ++ - PullRequest
2 голосов
/ 16 июня 2011

Я интегрирую чей-то код, в котором есть все в одном файле cpp. Основной код выглядит так:

class Outer
{
public:
   struct Inner
   {
      struct In_inner
      {
         ...
      }
   }
   int func(Inner& inn, Inner::In_inner& in_inn)
   {
      ...
   } 
}

Чтобы сделать разделение, я должен добавить "Outer ::" для параметра "Inner", как показано ниже?

в заголовочном файле

class Outer
{
public:
   struct Inner
   {
      struct In_inner
      {
         ...
      }
   }
   int func(Inner& inn, Inner::In_inner& in_inn);
}

и в файле cpp:

int Outer::func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn)
{
    ...
} 

Мне немного странно, что список параметров немного отличается от объявления. Кроме того, я могу снова сохранить все в том же файле и включить его в качестве файла заголовка?

Спасибо за любые комментарии!

Ответы [ 3 ]

4 голосов
/ 16 июня 2011
int Outer::func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn)

Да. Вы правильно написали это. Вы должны добавить Outer::, если определяете его вне класса.


Мне немного странно, что список параметров немного отличается от объявления

Это нормально. Функция определяется вне класса. Ты больше не в рамках класса. Следовательно, это выглядит немного иначе.

Но если вы не хотите, чтобы он выглядел по-другому, вы также можете написать Outer:: в объявлении, как показано ниже:

class Outer
{
public:
   //...
   int func(Outer::Inner& inn, Outer::Inner::In_inner& in_inn);
};

Это нормально, и будет работать, потому что Outer - это имя для инъекции, оно также доступно внутри класса.

struct A
{
    struct B { 
        struct C {};
    };

    B b1;    //okay - as usual
    A::B b2; //this is also okay - not so usual though

    B::C c1;    //okay - as usual
    A::B::C c2; //this is also okay - not so usual though

    A::A::A::A::A::A *pA; //this is very very unsual. But it is also okay!
};

Последняя строка в порядке, потому что имя A вводится внутри определения класса A. Следовательно, он становится рекурсивно доступным.

Смотри, он отлично компилируется

2 голосов
/ 16 июня 2011

Список параметров не отличается;типы одинаковы.Нередки случаи, когда в заголовочном файле явно указываются std:: члены, а в исходном файле также используется using namespace std;.Это в основном одно и то же.

Неважно, как вы квалифицируете типы, если они относятся к одним и тем же типам.И поскольку вы не входите в область действия Outer в исходном файле, здесь необходима явная квалификация.

1 голос
/ 16 июня 2011

В объявлении / определении класса вы находитесь в области видимости Outer ::. За пределами этого (в вашем .cpp) вас нет. Да, вы можете сохранить определение функции в заголовке: это неявное встроенное выражение.

...