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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Buildog
40 / 40 / 2
Регистрация: 29.04.2012
Сообщений: 185
#1

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

20.12.2012, 11:58. Просмотров 1492. Ответов 3
Метки нет (Все метки)

У меня имеется свой некоторый класс, для которого переопределена куча операций, в том числе и операторы + - * /, преподаватель дал задание написать абстрактный базовый класс и наследоваться от него:
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 не имеет оператора переопределения"

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

Класс: Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. - C++
Создать абстрактный базовый класс Figure с виртуальными методами вычисления площади и периметра. Создать производные классы: Rectangle...

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

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

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

абстрактный базовый класс - C++
люди подскажите.есть абстрактный базовый класс можно ли в нем определить конструктор копирования? написал в компиляторе,получается,что...

Абстрактный базовый класс(задача) - C++
Дано задание :Определите абстрактный базовый класс Person,содержащий поля &quot;пол&quot;,&quot;возраст&quot;. Затем определите производный класс Student,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 12:01 #2
Тут не экстросенсы на форуме, покажи код как ты описал SOK свой, скорее всего там что то не так, и ошибка имено в операции сравнения
0
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 минут
Только чтобы не ругался компилятор необходимо ещё показать перед виртуальной функцией, что есть такой класс
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,528
20.12.2012, 14:13 #4
у вас в базовом классе есть чистая виртуальная функция
C++
1
virtual int compare(const Object&)=0;
которую вы не определяете в производном классе (вместо нее вы определяете совершенно другую функцию
C++
1
int compare(const SOK &O);
поэтому производный класс по прежнему является абстрактным (содержащим чистую виртуальную функцию). в операторе вы возвращаете объект по значению, а создание абстрактного объекта запрещено.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 14:13
Привет! Вот еще темы с ответами:

Создать абстрактный базовый класс - C++
Помогите: Создать абстрактный базовый класс Container с виртуальными функциями вставки и извлечения. Создать производные классы Stack и...

Абстрактный базовый класс и множественное наследование - C++
Общая постановка. Создать программу с абстрактным базовым классом и множественным наследованием. Помогите разобраться почему не работает,...

Создать абстрактный базовый класс и производные - C++
Всем привет. Прошу подсказать, что-то у меня не выходит. Задание: Создайте абстрактный базовый класс &quot;Работник&quot;, один из методов которого,...

Создать абстрактный базовый класс Figure - C++
Здравствуйте,помогите пожалуйста с задачей. Создать абстрактный базовый класс Figure с виртуальной функцией - площадь поверхности....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.12.2012, 14:13
Ответ Создать тему
Опции темы

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