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

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

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

Столкнулся с проблемой при наследовании, и не могу разобраться, как решить.
Есть базовый класс 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++ typeid определяет тип указателя на базовый класс, как тип "базовый класс". Вне зависимости от присвоенного ему значения
C++ Создать базовый класс - Array и производный класс - Money для работы денежной суммы
C++ Можно-ли наследовать класс, в котором определен объект текущего класса?
error C2504: CMove: не определен базовый класс C++
Указатели в базовом классе на базовый класс и производный класс C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для 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
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 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.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:31     Не определен базовый класс #6
Реализация у базового класса есть? покажите срр файл
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 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.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
09.09.2012, 01:35     Не определен базовый класс #9
Цитата Сообщение от John Prick Посмотреть сообщение
Это понятно. Но это слово не из стандарта.

Кидайте весь проект, иначе ничего не понятно.
Весь лучше не надо - там еще танкер и порт есть)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
09.09.2012, 01:37     Не определен базовый класс #10
Цитата Сообщение от iandi Посмотреть сообщение
class SPoint abstract
Бред, уберите слово abstract. Абстрактный класс, это класс который содержит хотя бы одну чисто виртуальную функцию, у Вас она есть:
Цитата Сообщение от iandi Посмотреть сообщение
virtual void run() = 0;
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
09.09.2012, 01:42     Не определен базовый класс #11
Цитата Сообщение от I.M. Посмотреть сообщение
Весь лучше не надо - там еще танкер и порт есть)
НЕ поверите - пытаюсь повторить вашу ошибку у себя. Без танкера, порта, а самое главное int main(void) ничего у меня не получится.
I.M.
 Аватар для 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
549 / 502 / 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.
 Аватар для 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.
 Аватар для 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
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 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++ Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями
Не определен базовый класс C++
Не определен базовый класс C++

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

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

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