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

Абстрактный базовый класс - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
20.12.2012, 11:58     Абстрактный базовый класс #1
У меня имеется свой некоторый класс, для которого переопределена куча операций, в том числе и операторы + - * /, преподаватель дал задание написать абстрактный базовый класс и наследоваться от него:
C++
1
2
3
4
5
6
7
8
class Object
{
public:
    Object(){ };
    virtual ~Object(){ };
    virtual int compare(const Object&)=0;
private:
};
Я решил сделать хотя бы функцию сравнения для начала, просто в классе моё сравнение определено так:
C++
1
2
3
4
5
6
7
8
9
10
int SOK::compare(const SOK &O)
{
    int n1 = Show(); 
    int n2 = O.Show();
    if(n1 > n2)
        return 1;
    if(n1 < n2)
        return -1;
    return 0;
}
Всё бы ничего, тут ошибок нету, но зато они появляются в другом месте, при объявлении/определении операторов:
C++
1
2
3
4
5
6
7
    SOK operator+(SOK &O);
SOK SOK::operator+(SOK &O)
{
    SOK Temp (O);
    Temp.Addition(*this);
    return Temp;
}
и ошибка звучит так "Использование функции, возвращающей абстрактный базовый класс "SOK" не допускается: чистая виртуальная функция Object::compare не имеет оператора переопределения"

Только начал изучать виртуальные функции и наследование, представление имею, но только на поверхности, подскажите, в чем дело и как использовать их правильно в таких случаях
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2012, 11:58     Абстрактный базовый класс
Посмотрите здесь:

C++ абстрактный базовый класс
C++ абстрактный базовый класс
C++ Создать абстрактный базовый класс Vehicle
Абстрактный базовый класс(задача) C++
Создать абстрактный базовый класс Figure C++
C++ Создать абстрактный базовый класс список
Абстрактный базовый класс C++
C++ Создать абстрактный базовый класс
C++ Абстрактный базовый класс и множественное наследование
C++ Создать абстрактный базовый класс и производные
Абстрактный базовый класс C++
C++ Реализовать абстрактный базовый класс «Фигура»

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 12:01     Абстрактный базовый класс #2
Тут не экстросенсы на форуме, покажи код как ты описал SOK свой, скорее всего там что то не так, и ошибка имено в операции сравнения
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
20.12.2012, 13:46  [ТС]     Абстрактный базовый класс #3
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
44
45
46
47
48
#ifndef _SOK_H
#define _SOK_H
#include <iostream>
#include <string.h>
using namespace std;
 
class Object
{
public:
    Object(){ };
    virtual ~Object(){ };
    virtual int compare(const Object&)=0;
private:
};
class SOK:public Object
{
public:
    SOK(int number);
    SOK ();
    ~SOK();
    int Show () const;
    void ChangeNumb (int Numb);
    SOK (const SOK &);
    void Addition (const SOK &);
    void Subtraction (const SOK &);
    void Multiplication (const SOK &);
    void Division (const SOK &);
    SOK &operator= (const SOK &);
    operator int ();
    SOK operator+(SOK &O);
    SOK operator-(SOK &O);
    SOK operator*(SOK &O);
    SOK operator/(SOK &O);
    int compare(const SOK &O);
    int operator>(const SOK &O) { return compare(O) > 0; }
    int operator<(const SOK &O) { return compare(O) < 0; }
    int operator==(const SOK &O) { return compare(O) == 0; }
    friend ostream &operator << (ostream &O, SOK&T);
    friend istream &operator >> (istream &O, SOK&T);
 
private:
    void Create (int n);
    int *pOsnova;
    int *pOstatok;
    int NumbCount;
};
 
#endif

Вот полностью сравнение
C++
1
2
3
4
5
6
7
8
9
10
int SOK::compare(const SOK &O)
{
    int n1 = Show(); 
    int n2 = O.Show();
    if(n1 > n2)
        return 1;
    if(n1 < n2)
        return -1;
    return 0;
}
ну вот полностью сравнение

Добавлено через 1 минуту
С шаблонами класс работает отлично, как с int и double обычными, а вот с виртуальными функциями что то надо изменить, а вот что я не знаю..

Добавлено через 33 минуты
разобрался сам вроде, просто должно быть так
C++
1
virtual int compare(const SOK&)=0;
Добавлено через 12 минут
Только чтобы не ругался компилятор необходимо ещё показать перед виртуальной функцией, что есть такой класс
vxg
Модератор
 Аватар для vxg
2726 / 1737 / 173
Регистрация: 13.01.2012
Сообщений: 6,513
20.12.2012, 14:13     Абстрактный базовый класс #4
у вас в базовом классе есть чистая виртуальная функция
C++
1
virtual int compare(const Object&)=0;
которую вы не определяете в производном классе (вместо нее вы определяете совершенно другую функцию
C++
1
int compare(const SOK &O);
поэтому производный класс по прежнему является абстрактным (содержащим чистую виртуальную функцию). в операторе вы возвращаете объект по значению, а создание абстрактного объекта запрещено.
Yandex
Объявления
20.12.2012, 14:13     Абстрактный базовый класс
Ответ Создать тему
Опции темы

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