Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
#1

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

01.09.2013, 15:19. Просмотров 575. Ответов 10
Метки нет (Все метки)

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 ";
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2013, 15:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вложенный класс (C++):

Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? - C++
Ответ как бы знаю(нет , да). но наверное я что-то не так понимаю, т.к. примерчик написать не получается. class BaseClass { ...

вложенный класс - C++
Привет всем! создал класс и в этом классе создал еще класс... и я хочу использовать члены внешнего класса во внутреннем классе... такое...

вложенный класс - C++
Какие проблемы могут возникнуть в следующем объявлении вложенного класса? class Ribs { private: class Sauce { int soy; ...

Вложенный (внутренний) класс (inner class) - C++
Почему возникает ошибка? #include &lt;iostream&gt; using namespace std; class A { class B{ public: int r;

шаблонный вложенный класс в .cpp - C++
Привет всем! есть шаблонный вложенный класс . template&lt;typename FinalVertex&gt; class BFSVisitor : boost::default_bfs_visitor { ...

Вложенный шаблонный класс(разделение на файлы) - C++
Есть шаблонный класс для примера A&lt;T&gt; , в него вложен класс B&lt;T&gt; template&lt;class T&gt; class A { public: template&lt;class T&gt; ...

10
0x10
2480 / 1655 / 248
Регистрация: 24.11.2012
Сообщений: 4,100
01.09.2013, 15:30 #2
Разносите все - реализацию методов класса zer в том числе.
0
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
01.09.2013, 15:38 #3
ArkTaS,
я не понял, тебе нужен вложенный класс ins но не описанный в zer?
или просто класс ins с которым будет работать zer?
0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
01.09.2013, 19:48  [ТС] #4
Цитата Сообщение от ArkTaS Посмотреть сообщение
static void s(){ zer::ins::showIns(); }
Строка 8 ошибочна. Не получается вызвать стат. метод вложенного ins из стат. метода zer
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
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;
}
Ну и скорректировать доступ, - Ваш последний пост.
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 )
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
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;
}
1
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;}
};
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
02.09.2013, 22:14 #9
Цитата Сообщение от ArkTaS Посмотреть сообщение
а почему не работает аналогичное определение ф-и s() в классе zer ?
Думаю, потому что статический метод, - функция объявленная в классе для сокрытия имени в нём. Её определение, обычно размещается вне класса и в нашем случае, нужно обеспечить видимость метода ins::showIns из неё. Иначе как она его вызовет? Это не имеет отношения к ООП, а скорее правила областей видимости при объявлениях:
Цитата Сообщение от IGPIGP Посмотреть сообщение
void zer::s(){ ins::showIns(); }//тут методу объявленному в zer видно класс ins и его метод showIns
0
ArkTaS
1 / 1 / 0
Регистрация: 01.07.2013
Сообщений: 127
02.09.2013, 22:49  [ТС] #10
IGPIGP, void zer::s() -правило, а методу объявленному в zer видно класс ins и его метод showIn потому что ins:: Это я все понимаю. А вот почему не работает аналогичное определение внутри класса не понятно. Будь так любезны перефразировать предложение
Цитата Сообщение от IGPIGP Посмотреть сообщение
Думаю, потому что статический метод, - функция объявленная в классе для сокрытия имени в нём.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
03.09.2013, 00:20 #11
Цитата Сообщение от ArkTaS Посмотреть сообщение
Будь так любезны перефразировать предложение
Даже не знаю как ещё. S это статический метод. И когда он не видит определения класса ins, то только по объявлению отыскать ins::showIns() не может.
1
03.09.2013, 00:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2013, 00:20
Привет! Вот еще темы с ответами:

Шаблон, вложенный в него класс и оператор вывода - C++
Добрый день, делаю учебное задание. надо сделать шаблон стека с использованием односвязного списка. Сделал вот такую функцию: ...

Как дополнить вложенный класс при наследовании внешнего? - C++
Допустим, есть класс B, лежащий в классе A. Каким образом класс D, лежащий в C (C наследует A), может наследовать класс B и изменить его?

есть вложенный класс который является другом объемлюющего и всё это должно компилиться. - C++
Сперва логика: Есть класс matrix. И есть класс diagonal; так я поразмыслил и пришёл к выводу, что объект diagonal в отрыве от объекта...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru