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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
#1

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

20.07.2012, 21:46. Просмотров 2073. Ответов 19
Метки нет (Все метки)

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <iostream.h>
#include <conio.h>
#include <math.h>
#include <windows.h>
 
char bufRus[256];
char* Rus(const char* text)
{
    CharToOem(text,bufRus);
    return bufRus;
}
 
class Pair
{
        public:
    virtual void Read()=0;
    virtual void Display()=0;
    virtual void Add()=0;
    /*virtual void Sub()=0;
    virtual void Mul()=0;
    virtual void Div()=0;*/
 
};
 
class Complex: public Pair
{
        protected:
    int re;                        //действительная часть
    int im;                        //мнимая часть
        public:
    virtual void Read();
    Complex();                     //конструктор по умолчанию
    Complex(double re, double im); //конструктор от двух действ-х чисел
    Complex(const Complex &Orig);  //конструктор копирования
    virtual void Add(Complex A,Complex B);
    virtual void Display();
    //virtual void Sub();
 
};
 
 
 
void Complex::Read()
{
    while(true)
    {
        cout<<Rus("Введите действительную часть: ");
        cin>>re;
        cout<<Rus("Введите мнимую часть: ");
        cin>>im;
        if(cin.peek()=='\n')
        {
            cin.get();
            break;
        }
        else
        {
            cout<<Rus("Ошибка!!! Значения введены неправильно.")<<endl;
            cin.clear();
            while(cin.get()!='\n')
            {  }
        }
    }
    cout<<Rus("Значения введены верно.")<<endl<<endl;
}
 
//конструктор по умолчанию - реализация
Complex::Complex()
{
    re=0;
    im=0;
}
//конструктор от двух действ-х чисел - реализация
Complex::Complex(double re, double im)
{
    this->re=re;
    this->im=im;
}
//конструктор копирования - реализация
Complex::Complex(const Complex &Orig)
{
    re=Orig.re;
    im=Orig.im;
}
 
void Complex::Add(Complex A,Complex B)
{
    re=A.re+B.re;
    im=A.im+B.im;
}
 
void Complex::Display()
{
    cout<<re<<" "<<im<<"*i";
}
 
 
 
 
int main()
{
    Complex a,b,c;
    a.Read();
    b.Read();
 
 
 
 
 
 
    getch();
    return 0;
}
помогите исправить и объясните что не так делаю, т.к. возникают ошибки след. типа
[C++ Error] Unit1.cpp(39): E2123 Class 'Complex' may not contain pure functions
[C++ Error] Unit1.cpp(86): E2352 Cannot create instance of abstract class 'Complex'
[C++ Error] Unit1.cpp(86): E2353 Class 'Complex' is abstract because of 'Pair::Add() = 0'
[C++ Error] Unit1.cpp(86): E2352 Cannot create instance of abstract class 'Complex'
[C++ Error] Unit1.cpp(86): E2353 Class 'Complex' is abstract because of 'Pair::Add() = 0'
[C++ Error] Unit1.cpp(102): E2352 Cannot create instance of abstract class 'Complex'
[C++ Error] Unit1.cpp(102): E2353 Class 'Complex' is abstract because of 'Pair::Add() = 0'
[C++ Error] Unit1.cpp(102): E2352 Cannot create instance of abstract class 'Complex'
[C++ Error] Unit1.cpp(102): E2353 Class 'Complex' is abstract because of 'Pair::Add() = 0'
[C++ Error] Unit1.cpp(102): E2352 Cannot create instance of abstract class 'Complex'
[C++ Error] Unit1.cpp(102): E2353 Class 'Complex' is abstract because of 'Pair::Add() = 0'

заранее всем спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2012, 21:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Абстрактный класс (C++):

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

Абстрактный класс, наследование, класс хранится в другом классе - C++
Нужна помощь. Написать программу: 1 класс. Имеется абстрактный класс который описывает какую-то сущность, например Человек. В абстрактном...

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

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Абстрактный класс/Класс интерфейс - C++
Не ловлю суть в чем разница между интерфейсом и абстрактным классом. И там и там у методов нету реализации. Ну интерфейс задает набор...

Создать класс - данные - абстрактный базовый класс. Создать производные классы - C++
Всем привет! У меня вот такая проблема.... Создать класс - данные - абстрактный базовый класс. Создать производные классы - данные типа...

19
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
20.07.2012, 22:31 #2
хм.. интересно.. почему же класс Complex считается абстрактным..
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,800
Записей в блоге: 17
20.07.2012, 22:37 #3
По тому что сигнатуры ф-ции Add() классов несовпадают

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
class Pair
{
        public:
    virtual void Read()=0;
    virtual void Display()=0;
    virtual void Add(/*Complex A,Complex B*/)=0;  //    !=   virtual void Add(Complex A,Complex B);
};
1
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
20.07.2012, 23:09  [ТС] #4
так что виртуальные функции только пустыми бывают???
0
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
20.07.2012, 23:27 #5
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
так что виртуальные функции только пустыми бывают???
что? ? ? с чего такой вывод?
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
21.07.2012, 09:31 #6
Цитата Сообщение от Leomana Посмотреть сообщение
хм.. интересно.. почему же класс Complex считается абстрактным..
Цитата Сообщение от Avazart Посмотреть сообщение
По тому что сигнатуры ф-ции Add() классов несовпадают
нет, потому что Complex содержит чисто виртуальную ф-цию virtual void Add()=0;.

Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
так что виртуальные функции только пустыми бывают???
Это чисто виртуальные функции.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,800
Записей в блоге: 17
21.07.2012, 09:46 #7
нет, потому что Complex содержит чисто виртуальную ф-цию virtual void Add()=0;.
Ну вообще то не содержит ( наследует и не переопределяет)
Т.е. содержит, но не чисто-вирутальную и не ту что в базовом классе.
C++
1
2
3
4
5
/*virtual*/ void Complex::Add(Complex A,Complex B)
{
    re=A.re+B.re;
    im=A.im+B.im;
}
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
21.07.2012, 09:56 #8

Не по теме:

Avazart, сори, не правильно понял твое сообщение

Цитата Сообщение от Avazart Посмотреть сообщение
По тому что сигнатуры ф-ции Add() классов несовпадают
думал, что ты причину абстактности класса объясняешь именно этим, а не тем, что add()=0 не определена.


Цитата Сообщение от Avazart Посмотреть сообщение
Ну вообще то не содержит ( наследует и не переопределяет)
Ну чисто физически то содержит. И не "не переопределяет", а "не определяет". Ф-ция же чисто виртуальная, она не была определена.
0
-=MASTER=-
79 / 73 / 5
Регистрация: 15.03.2012
Сообщений: 259
21.07.2012, 10:45 #9
тут дело не в функции, а в её параметрах:
C++
1
 virtual void Add(Complex A,Complex B);
Использование параметра абстрактного типа класса "Complex" не допускается:
чисто виртуальная функция Pair::Add не имеет оператора переопределения

Добавлено через 11 минут
Та не можешь использовать виртуальную функцию абстрактного класса с параметрами типа этого же абстрактного класса, ты так можешь написать только в потомках. Либо делай её не виртуальной и называй по другому, либо придумывай другие параметры. Виртуальная функция, это не partial как С#. Её нельзя просто дописывать. Виртуальная - значит её тут нет и она реализуется в потомках, а ты вызываешь её с параметрами типа класса в котором её как бы нет, она там виртуальная. Пенемэ ?
А ваще дурацкий код
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
21.07.2012, 10:57 #10
Цитата Сообщение от -=MASTER=- Посмотреть сообщение
Виртуальная - значит её тут нет и она реализуется в потомках
Разве?
0
-=MASTER=-
79 / 73 / 5
Регистрация: 15.03.2012
Сообщений: 259
21.07.2012, 11:06 #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Разве?
Всё, ты меня уже совсем загрузил со своим полиморфизмом Я уже сам сомневаюсь в своих словах . И так с директ иксом в голове проблем куча
Единственное, чем могу помочь, это точной фразой, приведённой выше:

Использование параметра абстрактного типа класса "Complex" не допускается:
чисто виртуальная функция Pair::Add не имеет оператора переопределения

Она появляется при наведение на слово Complex в параметрах функции адд (VS2012)
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,800
Записей в блоге: 17
21.07.2012, 11:17 #12
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
class Pair
{
public:
    virtual void Read()=0;
    virtual void Display()=0;
 
    virtual void Add(Complex A,Complex B)=0;  // !!!!!!!
};
 
class Complex: public Pair
{
protected:
    int re;                        //действительная часть
    int im;                        //мнимая часть
        public:
    virtual void Read();
    Complex();                     //конструктор по умолчанию
    Complex(double re, double im); //конструктор от двух действ-х чисел
    Complex(const Complex &Orig);  //конструктор копирования
 
    virtual void Add(Complex A,Complex B);
};
 
 
void Complex::Add(Complex A,Complex B)
{
    re=A.re+B.re;
    im=A.im+B.im;
}
1
xADMIRALx
67 / 61 / 1
Регистрация: 09.06.2012
Сообщений: 291
21.07.2012, 11:30 #13
Вроде ж 1 раза в базовам классе достаточно virtual -а,или я неправ ?
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
21.07.2012, 12:15 #14
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Вроде ж 1 раза в базовам классе достаточно virtual -а,или я неправ ?
Да, достаточно. Но если написать virtual в наследнике ошибки не будет, зато стразу видно, что имеется ввиду виртуальная функция. Это повышает читабельность кода.
1
xADMIRALx
67 / 61 / 1
Регистрация: 09.06.2012
Сообщений: 291
21.07.2012, 12:24 #15
Kastaneda
А когда мы передаем функции аргумент типа
C++
1
2
3
void f(const int &a) // будит ли а занимать столько же место в памяти если мы сделаем
//void f(int a)//создается же полный экземпляр?
f(55);
а будит хранить адрес 55 ?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2012, 12:24
Привет! Вот еще темы с ответами:

Абстрактный класс в С++ - C++
Здравствуйте) Начаю изучать классы, можете мне показать абстрактные класс с перегруженным конструктором и наследованием. Например класс...

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

Абстрактный класс - C++
Друзья, подскажите пожалуйста. Как, вот в этом примере с виртуальной функцией, реализовать уже как абстрактный базовый класс, т.е. с чисто...

Абстрактный класс - C++
Ребят такая проблема, точнее недопонимания. Реализую графический редактор. Есть базовый абстрактный класс GraphObject От него...


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

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

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