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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 5.00
iandi
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
#1

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

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

Доброго времени суток.

Столкнулся с проблемой при наследовании, и не могу разобраться, как решить.
Есть базовый класс 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2012, 01:13     Не определен базовый класс
Посмотрите здесь:

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

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

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

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

Можно-ли наследовать класс, в котором определен объект текущего класса? - C++
Подскажите, пожалуйста, можно-ли делать так: class A { public: B objB; }; class B : public A {};

Как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С - C++
Всем привет, как в функции my_function преобразовать ссылку на базовый класс в ссылку на класс B или С ? class A { public: A(); ...

Базовый класс треугольник - C++
Здравствуйте! Ребята, кто может сделать это задание? Буду благодарен ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:17     Не определен базовый класс #2
class SPoint abstract

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

а если убрать слово abstract, то ошибки остаются?
Все равно остаются.
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
09.09.2012, 01:19     Не определен базовый класс #4
Цитата Сообщение от iandi Посмотреть сообщение
C++
1
class SPoint abstract
Не на слово abstract ли ругается? Откуда и зачем оно тут?

Добавлено через 31 секунду
Все равно остаются.
Какие именно? Те же?
iandi
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 01:24  [ТС]     Не определен базовый класс #5
Не на слово abstract ли ругается? Откуда и зачем оно тут?
Для того, чтобы нельзя было создать экземпляры класса.
Какие именно? Те же?
Такие же.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:31     Не определен базовый класс #6
Реализация у базового класса есть? покажите срр файл
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
09.09.2012, 01:33     Не определен базовый класс #7
Цитата Сообщение от iandi Посмотреть сообщение
Для того, чтобы нельзя было создать экземпляры класса.
Это понятно. Но это слово не из стандарта.

Кидайте весь проект, иначе ничего не понятно.
iandi
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;
}
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:35     Не определен базовый класс #9
Цитата Сообщение от John Prick Посмотреть сообщение
Это понятно. Но это слово не из стандарта.

Кидайте весь проект, иначе ничего не понятно.
Весь лучше не надо - там еще танкер и порт есть)
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
09.09.2012, 01:37     Не определен базовый класс #10
Цитата Сообщение от iandi Посмотреть сообщение
class SPoint abstract
Бред, уберите слово abstract. Абстрактный класс, это класс который содержит хотя бы одну чисто виртуальную функцию, у Вас она есть:
Цитата Сообщение от iandi Посмотреть сообщение
virtual void run() = 0;
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
09.09.2012, 01:42     Не определен базовый класс #11
Цитата Сообщение от I.M. Посмотреть сообщение
Весь лучше не надо - там еще танкер и порт есть)
НЕ поверите - пытаюсь повторить вашу ошибку у себя. Без танкера, порта, а самое главное int main(void) ничего у меня не получится.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:53     Не определен базовый класс #12
Цитата Сообщение от John Prick Посмотреть сообщение
НЕ поверите - пытаюсь повторить вашу ошибку у себя. Без танкера, порта, а самое главное int main(void) ничего у меня не получится.
Ошибка-то не моя, но я тоже не могу ее воспроизвести в liveworkspace. Надо бы в студии пробовать, но нет возможности
iandi
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;
    }
}
novi4ok
551 / 504 / 8
Регистрация: 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 - это класс, подробности о котором он узнает позже.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 02:05     Не определен базовый класс #15
novi4ok, там же вроде бы не ясно, есть ли перекрестные ссылки или нет. Как вы это поняли?
iandi
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 02:11  [ТС]     Не определен базовый класс #16
Цитата Сообщение от novi4ok Посмотреть сообщение
а что это такое? зачем эти инклуды?
При удалении инклудов, появляется ошибка "использование неопределенного типа". Да и #pragma once, насколько я понимаю, следит за тем, чтобы хедер подключался один раз?
I.M.
564 / 547 / 5
Регистрация: 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")
//...
};
можно проверить инклудится ли вообще заголовочный файл с базовым классом
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
09.09.2012, 02:57     Не определен базовый класс #18
Без всех файлов проекта (ну или хотя бы тех, что тут в коде не к ночи были упомянуты) ничего не собрать и не понять. Ясно одно - что-то где-то не определено.
iandi
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 20
09.09.2012, 04:29  [ТС]     Не определен базовый класс #19
Спасибо, разобрался. Все-таки из-за перекрестных инклудов была ошибка. А где можно подробнее почитать о предварительном объявлении? Ну и проектировании, чтобы в будущем этого избежать. В Буче как-то на этот счет ничего не нашел...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2012, 10:22     Не определен базовый класс
Еще ссылки по теме:

Абстрактный базовый класс - C++
Привет всем! У меня есть абстрактный базовый класс Object.Он содержит различные методы. Например, virtual void...

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

Неоднозначный базовый класс - C++
Есть класс Object - базовый для всех класов. Есть класс - интерфейс Comparable<T> template<typename T> class Comparable :...

базовый класс строки - C++
Есть код: #ifndef MYSTRING_H #define MYSTRING_H class mystring //базовый класс строки { protected: char *p; ...

Абстрактный базовый класс - C++
Создать абстрактный базовый класс с виртуальной функцией - объем. Создать производные классы: параллелепипед, пирамида, тетраэдр, шар со...


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

Или воспользуйтесь поиском по форуму:
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
09.09.2012, 10:22     Не определен базовый класс #20
Я думаю у тебя #pragma once не работал. Юзай include guard - так портабельнее и стандартнее
Yandex
Объявления
09.09.2012, 10:22     Не определен базовый класс
Ответ Создать тему
Опции темы

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