Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/89: Рейтинг темы: голосов - 89, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
1

Не определен базовый класс

09.09.2012, 01:13. Показов 17658. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Столкнулся с проблемой при наследовании, и не могу разобраться, как решить.
Есть базовый класс SPoint и два производных Tug, Terminal.

Хедеры
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma once
 
#include "Port.h"
#include "Tanker.h"
 
class Tanker;
class Port;
 
class SPoint abstract
{
public:
    SPoint();
    virtual ~SPoint();
    virtual void run() = 0;
    bool isRunning();
protected:
    int timer;
    Tanker* service;
    Port* port;
};
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
#pragma once
 
#include "SPoint.h"
#include "Config.h"
#include "Storm.h"
 
typedef enum {
    NOTWORK,
    DOCKING,
    DEPORT
} tugState_t;
 
class Port;
class Tanker;
 
class Tug :
    public SPoint
{
public:
    Tug(Port*, Storm*);
    ~Tug();
    void Docking(Tanker*);
    void Deport(Tanker*);
    void run();
private:
    tugState_t state;
    Storm* storm;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
 
#include "SPoint.h"
 
class Port;
class Tanker;
 
class Terminal :
    public SPoint
{
public:
    Terminal(Port*);
    ~Terminal();
    void LoadingStart(Tanker*);
    void run();
};


При компиляции выдает ошибку:
1> Tug.cpp
1> terminal.h(10): error C2504: SPoint: не определен базовый класс
1> Terminal.cpp
1> tug.h(18): error C2504: SPoint: не определен базовый класс
1> SPoint.cpp
1> tug.h(18): error C2504: SPoint: не определен базовый класс
1> terminal.h(10): error C2504: SPoint: не определен базовый класс
В чем тут проблема? Компилятор VS10
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2012, 01:13
Ответы с готовыми решениями:

Не определен базовый класс
Есть файл renderable.h: #pragma once #include "device.h" #include "mesh.h" class...

Не определен базовый класс
В проекте есть два проблемных класса: C_Button: #include "C_Scenes.h" class C_Button:...

Не определен базовый класс
Привет, есть проект с MyForm.h в котором я подключаю классы. И в итоге получаю ошибку в Player.h...

Не определен базовый класс
Есть класс C_Button, в нем определен метод buttonEvents(). Этому методу необходим метод класса...

19
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:17 2
class SPoint abstract

а если убрать слово abstract, то ошибки остаются?
0
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 01:18  [ТС] 3
Цитата Сообщение от I.M. Посмотреть сообщение
class SPoint abstract

а если убрать слово abstract, то ошибки остаются?
Все равно остаются.
0
2276 / 1767 / 741
Регистрация: 27.07.2012
Сообщений: 5,250
09.09.2012, 01:19 4
Цитата Сообщение от iandi Посмотреть сообщение
C++
1
class SPoint abstract
Не на слово abstract ли ругается? Откуда и зачем оно тут?

Добавлено через 31 секунду
Все равно остаются.
Какие именно? Те же?
0
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 01:24  [ТС] 5
Не на слово abstract ли ругается? Откуда и зачем оно тут?
Для того, чтобы нельзя было создать экземпляры класса.
Какие именно? Те же?
Такие же.
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:31 6
Реализация у базового класса есть? покажите срр файл
0
2276 / 1767 / 741
Регистрация: 27.07.2012
Сообщений: 5,250
09.09.2012, 01:33 7
Цитата Сообщение от iandi Посмотреть сообщение
Для того, чтобы нельзя было создать экземпляры класса.
Это понятно. Но это слово не из стандарта.

Кидайте весь проект, иначе ничего не понятно.
0
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 01:35  [ТС] 8
Цитата Сообщение от I.M. Посмотреть сообщение
Реализация у базового класса есть? покажите срр файл
Есть.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "SPoint.h"
 
 
SPoint::SPoint()
{
    timer = -1;
    service = NULL;
}
 
 
SPoint::~SPoint()
{
    delete service;
}
 
bool SPoint::isRunning()
{
    if (timer > 0)
        return true;
    else
        return false;
}
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:35 9
Цитата Сообщение от John Prick Посмотреть сообщение
Это понятно. Но это слово не из стандарта.

Кидайте весь проект, иначе ничего не понятно.
Весь лучше не надо - там еще танкер и порт есть)
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
09.09.2012, 01:37 10
Цитата Сообщение от iandi Посмотреть сообщение
class SPoint abstract
Бред, уберите слово abstract. Абстрактный класс, это класс который содержит хотя бы одну чисто виртуальную функцию, у Вас она есть:
Цитата Сообщение от iandi Посмотреть сообщение
virtual void run() = 0;
0
2276 / 1767 / 741
Регистрация: 27.07.2012
Сообщений: 5,250
09.09.2012, 01:42 11
Цитата Сообщение от I.M. Посмотреть сообщение
Весь лучше не надо - там еще танкер и порт есть)
НЕ поверите - пытаюсь повторить вашу ошибку у себя. Без танкера, порта, а самое главное int main(void) ничего у меня не получится.
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:53 12
Цитата Сообщение от John Prick Посмотреть сообщение
НЕ поверите - пытаюсь повторить вашу ошибку у себя. Без танкера, порта, а самое главное int main(void) ничего у меня не получится.
Ошибка-то не моя, но я тоже не могу ее воспроизвести в liveworkspace. Надо бы в студии пробовать, но нет возможности
0
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 01:57  [ТС] 13
Цитата Сообщение от John Prick Посмотреть сообщение
Это понятно. Но это слово не из стандарта.

Кидайте весь проект, иначе ничего не понятно.
Весь проект еще не готов. Просто по мере реализации отдельных классов - компилю, чтобы ошибки найти. Вот реализация производных классов:
Кликните здесь для просмотра всего текста

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
37
38
39
40
41
42
43
#include "Tug.h"
 
 
Tug::Tug(Port* _p, Storm* _s)
{
    port = _p;
    storm = _s;
    state = NOTWORK;
}
 
Tug::~Tug()
{
}
 
void Tug::Docking(Tanker* tanker)
{
    timer = CFG.dockingTime;
    service = tanker;
    state = DOCKING;
}
 
void Tug::Deport(Tanker* tanker)
{
    timer = CFG.deportTime;
    service = tanker;
    state = DEPORT;
}
 
void Tug::run()
{
    if ((timer > 0) && (!storm->isStormy()))
            timer--;
    if (timer == 0)
    {
        if (state == DOCKING)
            port->TankerDocked(service, this);
        else
            port->TankerDeported(service, this);
        timer = -1;
        service = NULL;
        state = NOTWORK;
    }
}
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
#include "Terminal.h"
 
 
Terminal::Terminal(Port* _p)
{
    port = _p;
}
 
 
Terminal::~Terminal()
{
}
 
void Terminal::LoadingStart(Tanker* tanker)
{
    service = tanker;
    timer = service->getLoadingTime();
}
 
void Terminal::run()
{
    if (timer > 0)
        timer--;
    if (timer == 0)
    {
        timer = -1;
        port->TankerLoaded(service, this);
        service = NULL;
    }
}
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.09.2012, 01:59 14
Цитата Сообщение от iandi Посмотреть сообщение
[SPOILER=Хедеры][CPP]
#include "Port.h"
#include "Tanker.h"

class Tanker;
class Port;
а что это такое? зачем эти инклуды? ты сам себя за волосы пытался поднять? и здесь тоже не получится.
если классы содержат указатели друг на друга - инклуды вводят компилятор в ступор: например, ClassA.h:
C++
1
2
3
4
5
#include "ClassB.h"
 
ClassA{
 ClassB *m_pClB;
};
и ClassB.h:
C++
1
2
3
4
5
#include "ClassA.h"
 
ClassB{
 ClassA *m_pClA;
};
компилятор открывает первый файл, встречает инклуд и включает его содержимое. там - инклуд, призывающий включить первый файл. идет распознавать ClassA, но не знает, что такое ClassB. если идет с другой стороны - та же история. для этого и существует "объявление наперед":
C++
1
2
3
4
class ClassB;
ClassA {
 ClassB *m_pClB;
...
и компилятор все понимает. он знает, что ClassB - это класс, подробности о котором он узнает позже.
1
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 02:05 15
novi4ok, там же вроде бы не ясно, есть ли перекрестные ссылки или нет. Как вы это поняли?
0
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 02:11  [ТС] 16
Цитата Сообщение от novi4ok Посмотреть сообщение
а что это такое? зачем эти инклуды?
При удалении инклудов, появляется ошибка "использование неопределенного типа". Да и #pragma once, насколько я понимаю, следит за тем, чтобы хедер подключался один раз?
0
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 02:49 17
А ведь novi4ok был скорее всего прав - полистал другие форумы - у людей аналогичная ошибка вылезала при некорректном include.

Надо поискать все файлы, которые подключают заголовочные файлы наследников. В вашем случае, надо искать те файлы, которые инклудят в себя terminal.h или tug.h. Скорее всего один из таких файлов косвенно или напрямую инклудится в базовый класс.

Также с помощью
C++
1
2
3
4
5
6
7
class SPoint
{
//...
   #pragma message("SPoint is included")
//...
};
можно проверить инклудится ли вообще заголовочный файл с базовым классом
1
2276 / 1767 / 741
Регистрация: 27.07.2012
Сообщений: 5,250
09.09.2012, 02:57 18
Без всех файлов проекта (ну или хотя бы тех, что тут в коде не к ночи были упомянуты) ничего не собрать и не понять. Ясно одно - что-то где-то не определено.
1
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 04:29  [ТС] 19
Спасибо, разобрался. Все-таки из-за перекрестных инклудов была ошибка. А где можно подробнее почитать о предварительном объявлении? Ну и проектировании, чтобы в будущем этого избежать. В Буче как-то на этот счет ничего не нашел...
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
09.09.2012, 10:22 20
Я думаю у тебя #pragma once не работал. Юзай include guard - так портабельнее и стандартнее
0
09.09.2012, 10:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2012, 10:22
Помогаю со студенческими работами здесь

Не определён базовый класс
компилятор выдаёт ошибку:error C2504: Confection: не определен базовый класс. Класс Filling...

error C2504: CMove: не определен базовый класс
Подскажите, пожалуйста, почему может возникать данная ошибка? Файл CBattle.h #include "CMove.h"...

Ошибка наследования error C2504: exception: не определен базовый класс
в .h файле пытаюсь унаследоваться class MyException : public exception { public: private:...

Ошибка компиляции - "класс" : базовый класс не определен
Помогите пожалуйста, у меня в проекте есть несколько классов, которые имеют отдельные header и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru