Форум программистов, компьютерный форум CyberForum.ru

Вложенный класс - C++

Восстановить пароль Регистрация
 
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
01.09.2013, 15:19     Вложенный класс #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class zer
{
class ins
{
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
};
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
    static void s(){ ins::showIns(); }
};
/*
class zer::ins
{
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
 
};*/
 
const string zer::ins::st=" Ins ";
const string zer::st=" Zer ";
void main()
{
   setlocale( LC_ALL,"Russian" );
   zer::s();
   cout<<endl;
   system("pause");
}
В результате выполнения будет выведено сообщение " Ins " то что и предполагалось. Подскажите возможно сделать то же самое если вынести определение класса ins за пределы zer. Студия мгновенно подчеркивает ошибку в функции s(){ zer::ins::showIns();} - недопустимый неполный тип !
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class zer
{
    class ins;
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
    static void s(){ zer::ins::showIns(); }
};
 
class zer::ins
{
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
 
};
 
const string zer::ins::st=" Ins ";
const string zer::st=" Zer ";
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
01.09.2013, 15:30     Вложенный класс #2
Разносите все - реализацию методов класса zer в том числе.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
01.09.2013, 15:38     Вложенный класс #3
ArkTaS,
я не понял, тебе нужен вложенный класс ins но не описанный в zer?
или просто класс ins с которым будет работать zer?
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
01.09.2013, 19:48  [ТС]     Вложенный класс #4
Цитата Сообщение от ArkTaS Посмотреть сообщение
static void s(){ zer::ins::showIns(); }
Строка 8 ошибочна. Не получается вызвать стат. метод вложенного ins из стат. метода zer
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,702
Записей в блоге: 3
01.09.2013, 20:20     Вложенный класс #5
ArkTaS, для выполнения Вашей задачи нужно обеспечить видимость при объявлении. Правильно разнести определения вне классов, это то что предлагает 0x10:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
class zer
{
 
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
    static void s();
};
 
class ins
{
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
};
 
const string ins::st=" Ins ";
const string zer::st=" Zer ";
void zer::s(){ ins::showIns(); }//тут методу объявленному в zer видно класс ins и его метод showIns 
 
int main()
{
SetConsoleCP (1251); SetConsoleOutputCP (1251);
zer::s();
cin.get();
    return 0;
}
Ну и скорректировать доступ, - Ваш последний пост.
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
01.09.2013, 20:49  [ТС]     Вложенный класс #6
IGPIGP, В вашем коде объявление и определение ins вынесены за пределы zer, то есть ins перестал быть вложенным для zer. Если взглянуть на 1 мое сообщение: в 1-м окне с кодом приведен рабочий код. Там объявляется и определяется класс ins в zer.
Во 2-м окне приведен не рабочий код. Там класс ins объявляется в zer, но его определение вынесено наружу. И он не работает! Студия указывает на строку кода №8 static void s(){ zer::ins::showIns(); }. Как это исправить не меняя структуры программы, а только эту строчку ! В том и фишка что я хочу оставить класс ins вложенным в zer, оставить его локальным, но при этом вынести его определение наружу для ускорения компиляции. ( Страуструп "Дизайн и Эволюция языка С++" стр 295 )
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,702
Записей в блоге: 3
01.09.2013, 22:52     Вложенный класс #7
Цитата Сообщение от ArkTaS Посмотреть сообщение
Во 2-м окне приведен не рабочий код.
Рекомендации те же:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
class zer
{
class ins;
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
    static void s();
 
 
};
class zer::ins
{
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
 
};
const string zer::ins::st=" Ins ";
const string zer::st=" Zer ";
void zer::s(){ ins::showIns(); }
 
int main()
{
SetConsoleCP (1251); SetConsoleOutputCP (1251);
zer::s();
cin.get();
    return 0;
}
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
02.09.2013, 22:08  [ТС]     Вложенный класс #8
IGPIGP, Спасибо, скажите, а почему не работает аналогичное определение ф-и s() в классе zer ?
C++
1
2
3
4
5
6
7
8
class zer
{
class ins;
    static const string st;
public:
    static void showIns(){ cout<<endl<<st; }
    static void s() { ins::showIns;}
};
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,702
Записей в блоге: 3
02.09.2013, 22:14     Вложенный класс #9
Цитата Сообщение от ArkTaS Посмотреть сообщение
а почему не работает аналогичное определение ф-и s() в классе zer ?
Думаю, потому что статический метод, - функция объявленная в классе для сокрытия имени в нём. Её определение, обычно размещается вне класса и в нашем случае, нужно обеспечить видимость метода ins::showIns из неё. Иначе как она его вызовет? Это не имеет отношения к ООП, а скорее правила областей видимости при объявлениях:
Цитата Сообщение от IGPIGP Посмотреть сообщение
void zer::s(){ ins::showIns(); }//тут методу объявленному в zer видно класс ins и его метод showIns
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
02.09.2013, 22:49  [ТС]     Вложенный класс #10
IGPIGP, void zer::s() -правило, а методу объявленному в zer видно класс ins и его метод showIn потому что ins:: Это я все понимаю. А вот почему не работает аналогичное определение внутри класса не понятно. Будь так любезны перефразировать предложение
Цитата Сообщение от IGPIGP Посмотреть сообщение
Думаю, потому что статический метод, - функция объявленная в классе для сокрытия имени в нём.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2013, 00:20     Вложенный класс
Еще ссылки по теме:

шаблонный вложенный класс в .cpp C++
Вложенный (внутренний) класс (inner class) C++
C++ Шаблон, вложенный в него класс и оператор вывода

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6167 / 2896 / 282
Регистрация: 04.12.2011
Сообщений: 7,702
Записей в блоге: 3
03.09.2013, 00:20     Вложенный класс #11
Цитата Сообщение от ArkTaS Посмотреть сообщение
Будь так любезны перефразировать предложение
Даже не знаю как ещё. S это статический метод. И когда он не видит определения класса ins, то только по объявлению отыскать ins::showIns() не может.
Yandex
Объявления
03.09.2013, 00:20     Вложенный класс
Ответ Создать тему
Опции темы

Текущее время: 05:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru