Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абстрактный класс - проблемы 
V
    Опции темы
Riddik
Дата 5.5.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Что-то я запутался.
Есть абстрактный базовый класс:
Код

class BaseK
{
  public: 
     virtual void Picter()=0;
};


Из него наследуется другой:
Код

class Ground : public BaseK
{
   ...
public:
    void Picter() {...}
};


Если не объявлять экземпляр класса Ground, то всё в порядке.
А если объявить

Код

Ground ground;


Не хочет компилироваться:

error C2259: 'Ground' : cannot instantiate abstract class due to following members:
        c:\prog\classes.h(194) : see declaration of 'Ground'
c:\prog\main.cpp(13) : warning C4259: 'void __thiscall BaseK::Picter(void)' : pure virtual function was not defined
        c:\prog\classes.h(184) : see declaration of 'Picter'
c:\prog\main.cpp(13) : error C2259: 'Ground' : cannot instantiate abstract class due to following members:
        c:\prog\classes.h(194) : see declaration of 'Ground'
c:\prog\main.cpp(13) : warning C4259: 'void __thiscall BaseK::Picter(void)' : pure virtual function was not defined
        c:\prog\classes.h(184) : see declaration of 'Picter'


Если объявить как указатель Ground *pground; - компилируется, но слишком много переделывать - критические ошибки в райнтайме. 

Что не так делаю?

Добавлено через 3 минуты и 36 секунд
Сначала код писался без абстрактного класса и все идеально работало. Теперь появилась необходимость использовать указатель на базовый класс, поэтому перед уже рабочим и протестированным классом я вставил абстрактный класс, а "рабочий" класс сделал наследуемым от него.
PM MAIL   Вверх
azesmcar
Дата 5.5.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Riddik
странно как-то..
Код

class BaseK
{
public: 
    virtual void Picter()=0;
};

class Ground : public BaseK
{
public:
    void Picter() {

    }
};
int main()
{
    Ground ground;
}

это не работает???
проверь имя функции Picter в базовом классе и в наследнике..может по другому написано?
PM   Вверх
Riddik
Дата 5.5.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Хм... ошибка возникает, если использую перегруженные ф-ии. В рабочем коде (макет которого я здесть привёл) в абстрактном классе:
Код

virtual void Picter()=0;
virtual void Picter(short)=0;


Нельзя так делать?

PM MAIL   Вверх
Fazil6
Дата 5.5.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(Riddik @  5.5.2009,  14:39 Найти цитируемый пост)
Нельзя так делать?

можно.


Цитата(Riddik @  5.5.2009,  14:39 Найти цитируемый пост)
Хм... ошибка возникает, если использую перегруженные ф-ии. В рабочем коде (макет которого я здесть привёл) в абстрактном классе:

я так понимаю, что то, что ты тут привел с твоим кодом имеет общего только 
Код

class Ground : public BaseK


PM MAIL   Вверх
Riddik
Дата 5.5.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Я не могу привести весь код из-за его размеров.

Вот в чём, возможно проблема: в абстрактном классе объявлено несколько виртуальных функций, в одном наследнике только часть этих функций реализуется, другая часть даже не упоминается, а в другом наследнике - другая, урощенный пример:
Код

class base
{
public:
virtual void Move()=0;
virtual void Stop()=0;
};

class A : public base
{
public:
void Move() {...}
};

class B : public base
{
public:
void Stop() {...}
};


Может, в этом проблема?
 
PM MAIL   Вверх
Lazin
Дата 5.5.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(Riddik @  5.5.2009,  14:58 Найти цитируемый пост)
Может, в этом проблема?

да, у тебя классы A и B - абстрактные
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 5.5.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Оба класса тут абстрактны.
Так как в одном не определена функция Move, в другом - Stop.
Надо определить оба
PM   Вверх
Lazin
Дата 5.5.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



может тебе нужно было сделать так?
Код

class base
{
public:
virtual void Move()=0;
virtual void Stop()=0;
};
class A : public base
{
public:
void Move() {...}
};
class B : public A
{
public:
void Stop() {...}
};

PM MAIL Skype GTalk   Вверх
Riddik
Дата 5.5.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Да, блин smile 
Спасибо, что помогли увидеть вроде бы очевидную проблему!




Lazin, в моём случае - нет, иначе B унаследует много ненужного для себя из А. 

Будет "цепочка" похожих классов, выведенных из абстрактного, поэтому лучше сделать два абстрактных класса в моём случае.

Спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.