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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
20.07.2012, 21:46     Абстрактный класс #1
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'

заранее всем спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2012, 21:46     Абстрактный класс
Посмотрите здесь:

Абстрактный класс C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... C++
C++ Абстрактный класс
C++ Создать класс - данные - абстрактный базовый класс. Создать производные классы
C++ Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
20.07.2012, 22:31     Абстрактный класс #2
хм.. интересно.. почему же класс Complex считается абстрактным..
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 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);
};
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
20.07.2012, 23:09  [ТС]     Абстрактный класс #4
так что виртуальные функции только пустыми бывают???
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
20.07.2012, 23:27     Абстрактный класс #5
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
так что виртуальные функции только пустыми бывают???
что? ? ? с чего такой вывод?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.07.2012, 09:31     Абстрактный класс #6
Цитата Сообщение от Leomana Посмотреть сообщение
хм.. интересно.. почему же класс Complex считается абстрактным..
Цитата Сообщение от Avazart Посмотреть сообщение
По тому что сигнатуры ф-ции Add() классов несовпадают
нет, потому что Complex содержит чисто виртуальную ф-цию virtual void Add()=0;.

Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
так что виртуальные функции только пустыми бывают???
Это чисто виртуальные функции.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 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;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.07.2012, 09:56     Абстрактный класс #8

Не по теме:

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

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


Цитата Сообщение от Avazart Посмотреть сообщение
Ну вообще то не содержит ( наследует и не переопределяет)
Ну чисто физически то содержит. И не "не переопределяет", а "не определяет". Ф-ция же чисто виртуальная, она не была определена.
-=MASTER=-
77 / 71 / 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 как С#. Её нельзя просто дописывать. Виртуальная - значит её тут нет и она реализуется в потомках, а ты вызываешь её с параметрами типа класса в котором её как бы нет, она там виртуальная. Пенемэ ?
А ваще дурацкий код
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.07.2012, 10:57     Абстрактный класс #10
Цитата Сообщение от -=MASTER=- Посмотреть сообщение
Виртуальная - значит её тут нет и она реализуется в потомках
Разве?
-=MASTER=-
77 / 71 / 5
Регистрация: 15.03.2012
Сообщений: 259
21.07.2012, 11:06     Абстрактный класс #11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Разве?
Всё, ты меня уже совсем загрузил со своим полиморфизмом Я уже сам сомневаюсь в своих словах . И так с директ иксом в голове проблем куча
Единственное, чем могу помочь, это точной фразой, приведённой выше:

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

Она появляется при наведение на слово Complex в параметрах функции адд (VS2012)
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 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;
}
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
21.07.2012, 11:30     Абстрактный класс #13
Вроде ж 1 раза в базовам классе достаточно virtual -а,или я неправ ?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
21.07.2012, 12:15     Абстрактный класс #14
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Вроде ж 1 раза в базовам классе достаточно virtual -а,или я неправ ?
Да, достаточно. Но если написать virtual в наследнике ошибки не будет, зато стразу видно, что имеется ввиду виртуальная функция. Это повышает читабельность кода.
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 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 ?
-=MASTER=-
77 / 71 / 5
Регистрация: 15.03.2012
Сообщений: 259
21.07.2012, 12:39     Абстрактный класс #16
Цитата Сообщение от Kastaneda Посмотреть сообщение
Да, достаточно. Но если написать virtual в наследнике ошибки не будет, зато стразу видно, что имеется ввиду виртуальная функция. Это повышает читабельность кода.
Если в наследнике ты пишешь виртуал тоже, то значит она является виртуальной и для следующего потомства...вроде так.
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
21.07.2012, 13:00     Абстрактный класс #17
Цитата Сообщение от Avazart Посмотреть сообщение
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;
}
C++
1
virtual void Add(Complex A,Complex B)=0;
так ведь писать нельзя..так как класс Pair ничего не знает о классе-потомке Complex... ??
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
21.07.2012, 13:06     Абстрактный класс #18
так ведь писать нельзя..так как класс Pair ничего не знает о классе-потомке Complex... ??
А зачем ему знать?
Leomana
58 / 58 / 5
Регистрация: 29.06.2012
Сообщений: 188
21.07.2012, 13:18     Абстрактный класс #19
Цитата Сообщение от Avazart Посмотреть сообщение
А зачем ему знать?
затем, чтобы компилятор ошибок не выдавал
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2012, 13:43     Абстрактный класс
Еще ссылки по теме:

C++ Абстрактный класс
C++ абстрактный класс
Абстрактный класс/Класс интерфейс C++

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 17
21.07.2012, 13:43     Абстрактный класс #20
Ну так что мешает сделать предъявление? Но суть не в том, суть в том что не продумана сама иерархия.
Yandex
Объявления
21.07.2012, 13:43     Абстрактный класс
Ответ Создать тему
Опции темы

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