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

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

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

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

07.12.2012, 15:34. Просмотров 347. Ответов 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;
}
Т.е. дело - в порядке объявления хедеров.

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

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

C++ Ошибка при наследовании
C++ Ошибка при наследовании
C++ Ошибка при наследовании
Конструкторы при наследовании C++
С++ течет при наследовании C++
C++ Ошибка при наследовании?
Конструкторы при наследовании C++
Сравнение при наследовании C++
C++ Неоднозначность при наследовании
Деструктор при наследовании C++
Ошибка при наследовании C++
Ошибка при наследовании C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 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
prazuber
108 / 108 / 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, в любом порядке
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 - определение имени, и получается у вас если менять местами имя вначале определится в В и не возможно будет зайти в тело макроса С, либо наоборот, либо уберите либо прочитайте как это работает
John Prick
771 / 704 / 128
Регистрация: 27.07.2012
Сообщений: 2,015
Завершенные тесты: 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
Вместо А_Н используй уникальные имена для каждого хэдера.
Yandex
Объявления
07.12.2012, 15:39     Какая-то неопределенность при наследовании
Ответ Создать тему
Опции темы

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