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

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

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.03.2013, 11:55     вложенные классы #1
Здорова господа!
Снова мучаю класс String еще не замучал.
Не могу скомпилировать программу с вложенным классом вот код:
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
#include <iostream>
using std::cout;
using std::endl;
 
class String
{
    struct Srep;//predctavlenie
    Srep* rep;//ykazatel6
    
public:
    void read(int i)
    {
        cout <<rep->s[i];
    }   
    
};
 
struct String::Srep
{
    char* s;//ctroka
    int sn;//kol cimvolov
};
 
int main()
{
    
    
    return 0;
}
Я взял кусочек смоделировал ошибку которая у меня вылазит, от сама ошибка:

./test8.cpp: В функции-члене «void String::read(int)»:
./test8.cpp:13:13: ошибка: invalid use of incomplete type «struct String::Srep»
./test8.cpp:7:9: ошибка: forward declaration of «struct String::Srep»


Ну теперь о самой сути в обрамляющем классе вложенный класс можно просто объявить, а определить можно и за пределами класса, что я и сделал, так почему же у меня вылазит ошибка? (Это не я придумал это в книге так написано, а на практике фигня выходит).

Кода создаю определение класса внутри String, то компилится как положено.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2013, 11:55     вложенные классы
Посмотрите здесь:

Перегрузка операция + вложенные классы C++
Композиция двух классов и вложенные классы C++
C++ Вложенные классы!!
"вложенные классы" C++
Вложенные циклы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.03.2013, 12:06     вложенные классы #2
В 13 строке на момент обращения к полю структуры еще нет определения самой структуры, отсюда и ошибка. Предлагаю сделать две вещи:
1) раскидать код по файлам, компилировать отдельно;
2) писать нормальные комментарии, а не в стиле "ctroka".

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
C++
1
void read(int i) { cout <<rep->s[i]; }
Напомнило фрагмент доклада Андрея Аксенова, где он говорил, что у некоторых разработчиков в голове нечто вроде макаронного монстра. И там он приводит пример именно такого именования методов.

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.03.2013, 16:03  [ТС]     вложенные классы #3
Цитата Сообщение от 0x10 Посмотреть сообщение
В 13 строке на момент обращения к полю структуры еще нет определения самой структуры, отсюда и ошибка. Предлагаю сделать две вещи:
1) раскидать код по файлам, компилировать отдельно;
2) писать нормальные комментарии, а не в стиле "ctroka".
ну и как же мне его разбить?
Я пробовал String.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef STRING_H
#define STRING_H
 
#include <iostream>
using std::cout;
 
class String
{
    struct Srep;//predctavlenie
    Srep* rep;//ykazatel6
    
public:
    void read(int i)
    {
        cout <<rep->s[i];
    }   
    
};
 
#endif
и String.cpp

C++
1
2
3
4
5
6
7
#include "String2.h"
 
struct String::Srep
{
    char* s;//ctroka
    int sn;//kol cimvolov
};
при g++ ./String.cpp -c
ошибку туже выводит

А по другому я даже не знаю на какие файлы разбить. Класс Srep вложенный его ж отдельно нельзя создавать или хз.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11818 / 6797 / 769
Регистрация: 27.09.2012
Сообщений: 16,870
Записей в блоге: 2
Завершенные тесты: 1
18.03.2013, 16:04     вложенные классы #4
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
#include <iostream>
using std::cout;
using std::endl;
 
class String
{
    struct Srep;//predctavlenie
    Srep* rep;//ykazatel6
    
public:
    void read(int i);
    
};
 
struct String::Srep
{
    char* s;//ctroka
    int sn;//kol cimvolov
};
     void String::read(int i)
    {
        cout <<rep->s[i];
    }   
int main()
{
    
    
    return 0;
}
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
18.03.2013, 16:10  [ТС]     вложенные классы #5
Croessmah, Молодец! Я б фиг бы додумался в книге именно так имелось в виду, то я просто уже чуток переделал неправильно.
Yandex
Объявления
18.03.2013, 16:10     вложенные классы
Ответ Создать тему
Опции темы

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