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

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

Войти
Регистрация
Восстановить пароль
 
amfisat
67 / 67 / 1
Регистрация: 16.06.2009
Сообщений: 240
#1

Какая-то неопределенность при наследовании - C++

07.12.2012, 15:34. Просмотров 364. Ответов 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
30
31
32
33
34
35
36
//A.h
class A {
    A();
    virtual ~A();
};
 
 
//B.h
#ifndef A_H
#define A_H
class B : public A {
    B();
    ~B();
};
#endif
 
 
//C.h
#ifndef A_H
#define A_H
class C : public A {
    C();
    ~C();
};
#endif
 
 
//main.cpp
#include "A.h"
#include "B.h"
#include "C.h"
int main() {
    B *b;
    C *c; //здесь ругается: С - необъявленный идентификатор
    return 0;
}
Второй вариант main.cpp:
C++
1
2
3
4
5
6
7
8
9
//main.cpp
#include "A.h"
#include "C.h"
#include "B.h"
int main() {
    B *b; //здесь ругается: B - необъявленный идентификатор
    C *c; 
    return 0;
}
Т.е. дело - в порядке объявления хедеров.

Как можно решить эту проблему?

Спасибо за любую помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2012, 15:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какая-то неопределенность при наследовании (C++):

Использование шаблонов при наследовании, ошибка при компиляции - C++
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает...

Конструкторы при наследовании - C++
Добрый вечер. Пишу программу с наследованием классов. Класс-родитель - nasled, производный от него - steck. Когда пытаюсь вызвать...

С++ течет при наследовании - C++
Если был создан класс где его поля размещались в стеке (Foo) и унаследован классом (Foo1) который создается динамически. Как...

Сравнение при наследовании - C++
Есть базовый класс, пусть его зовут А, а у него есть 4 потомка. Пусть их зовут: B, C, D и E. Базовый класса абстрактный,в нём есть...

Неоднозначность при наследовании - C++
Привет народ, думаю мой вопрос покажется вам чем-то из разряда "лучше бы делом занялся", но тех у кого останется терпение, прошу помочь мне...

Присвоение при наследовании - C++
Всем доброго дня ! Подскажите пожалуйста как сделать так , что-бы при выполнении операции a = c; вызывались операторы = обеих ...

4
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
07.12.2012, 15:37 #2
C++
1
2
3
4
//C.h
#ifndef A_H
#define A_H
#endif
причина в этом. Макрос A_H уже был определён в файле а.h и значит всё содержимое файла с.н пропускается
либо это невнимательность. Либо ты используешь то, что не знаешь как работает. Правильно будет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//B.h
#ifndef B_H
#define B_H
class B : public A {
    B();
    ~B();
};
#endif
 
 
//C.h
#ifndef C_H
#define C_H
class C : public A {
    C();
    ~C();
};
#endif
0
prazuber
110 / 110 / 3
Регистрация: 29.04.2010
Сообщений: 240
07.12.2012, 15:37 #3
A.h: #ifndef A_H
A.h: #ifndef B_H
A.h: #ifndef C_H
main.cpp: достаточно инклюдить только B.h и C.h, в любом порядке
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
07.12.2012, 15:38 #4
проблема не в наследовании а в припроцессинге. Вы знаете зачем вот это нужно?
C++
1
2
3
4
#ifndef A_H
#define A_H
 
#endif
этот макрос предпологает исключить переопределение какойто структуры внутри своего тела
#ifndef A_H -проверка на то что имя A_H не определено
#define A_H - определение имени, и получается у вас если менять местами имя вначале определится в В и не возможно будет зайти в тело макроса С, либо наоборот, либо уберите либо прочитайте как это работает
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
07.12.2012, 15:39 #5
Цитата Сообщение от amfisat Посмотреть сообщение
Как можно решить эту проблему?
Её не надо было создавать.
У тебя в хедерах один и тот же символ определён через #define
C++
1
2
3
4
5
6
7
8
9
10
11
//B.h
#ifndef A_H
#define A_H
// ...
#endif
 
//C.h
#ifndef A_H
#define A_H
// ...
#endif
Вместо А_Н используй уникальные имена для каждого хэдера.
0
07.12.2012, 15:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 15:39
Привет! Вот еще темы с ответами:

Ошибка при наследовании - C++
Привет! Ни как не могу разобраться, в чём дело. Создал 2 класса: Base и Derived, где Derived наследует Base. Но при компиляции возникает...

Ошибка при наследовании - C++
Имеется архитектура вида: класс "человек", от него производные "препод" и "член приемной комиссии". От их двоих производный класс "Препод и...

Ошибка при наследовании - C++
Вот такой код: class Figure2 { protected: int Color; int CenterX; int CenterY; public:

Ошибка при наследовании? - C++
Программа компилируется, но консоль не выдает информацию. Связано ли это как то с переполнением буфера? Программа небольшая укажите...


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

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

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