Синтаксис для класса внутри класса в C ++ - PullRequest
1 голос
/ 16 марта 2011

Если у меня есть следующее

class A
    {
    public:
        int stuff;
            void helper(B temp, int d); //what about here? I'm getting a 'B' has not been declared error here.
    private:
        class B 
        {
        public:
            int stuffer;
        private:
            int x;
        };
    }:

Как правильно ссылаться на класс 2 в моем файле реализации? Будет ли это 1::2::someMethod? Или 2::someMethod?

Ответы [ 5 ]

3 голосов
/ 16 марта 2011

Предполагая, что 1 и 2 относятся к РЕАЛЬНЫМ именам классов, 1::2::methodName точно так же, как и любые другие вложенные области видимости.

1 голос
/ 16 марта 2011

Если вы находитесь внутри метода класса 1, вы можете использовать 2 :: somemethod.В других местах используйте 1 :: 2 :: somemethod.«Inside» включает объявления аргументов метода в реализациях методов класса 1, но не декларации возвращаемых значений для реализаций методов класса 1.

1 голос
/ 16 марта 2011

Прежде всего, имя класса не может начинаться с целого числа. Так что переименовав их:

 class A
 {
    public:
        int stuff;
    private:
        class B 
        {
        public:
            int stuffer;
        private:
            int x;
        };
  };

Во-вторых, поскольку вложенный класс B находится в закрытом разделе, вы не можете получить к нему доступ за пределами области действия класса A. B доступно только для A. А синтаксис объявления объекта типа B будет B bObj; в области действия A.

Теперь вам следует сначала попробовать себя, прежде чем задавать дальнейшие вопросы!


Что касается вашего редактирования (добавленный вопрос): он не компилирует , потому что к тому времени, когда компилятор видит B temp, он еще не видел определения B, поэтому он говорит B не объявлено!

Исправление очень простое. Объявите B перед его использованием, что-то вроде этого:

class A
{
private:
        class B 
        {
        public:
            int stuffer;
        private:
            int x;
        };
    public:
        int stuff;
        void helper(B temp, int d);

 }; //<--- this is also fixed. your code has 'colon', instead semi-colon!

Также прочитайте комментарий в конце урока!

0 голосов
/ 19 сентября 2015

Синтаксис для вложенного класса:

Class class_name1
{  
    Private:
        Data members
    Public: 
        Member functions
        {
        .........
        }
        Class class_name2  //class2 is embedded with class1
        {
            Private:
                Data members
            Public: 
                Member functions
                {
                .........
                }
        };  // class2
};  //class1

Вложенный класс может определять один класс в другом классе, поскольку объявление класса определяет область действия.

Вложенный класс действителен только в рамках включающего класса.

Необходимость вложенного класса практически не существует.

0 голосов
/ 16 марта 2011

Это зависит от того, на каком уровне вы находитесь. Внутри функции-члена для класса 1 это будет class_2::someMethod. В области видимости файла это будет class_1::class_2::someMethod. Всегда правильно полностью квалифицировать имя функции или переменной таким образом, но иногда это более типично, чем строго необходимо. В общем случае вам нужен оператор разрешения области действия ::, когда компилятор не может самостоятельно определить, на что вы ссылаетесь.

На практике лучший способ выяснить это попробовать и посмотреть, что получится . Если компилятор выдает ошибку, бросьте перед ней имя класса и повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...