Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
1

Абстрактный класс

20.07.2012, 21:46. Просмотров 3219. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2012, 21:46
Ответы с готовыми решениями:

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... ...

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

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

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

19
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
20.07.2012, 22:31 2
хм.. интересно.. почему же класс Complex считается абстрактным..
0
Эксперт С++
8290 / 6046 / 600
Регистрация: 10.12.2010
Сообщений: 28,115
Записей в блоге: 25
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
8 / 8 / 1
Регистрация: 30.06.2011
Сообщений: 250
20.07.2012, 23:09  [ТС] 4
так что виртуальные функции только пустыми бывают???
0
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
20.07.2012, 23:27 5
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
так что виртуальные функции только пустыми бывают???
что? ? ? с чего такой вывод?
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
21.07.2012, 09:31 6
Цитата Сообщение от Leomana Посмотреть сообщение
хм.. интересно.. почему же класс Complex считается абстрактным..
Цитата Сообщение от Avazart Посмотреть сообщение
По тому что сигнатуры ф-ции Add() классов несовпадают
нет, потому что Complex содержит чисто виртуальную ф-цию virtual void Add()=0;.

Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
так что виртуальные функции только пустыми бывают???
Это чисто виртуальные функции.
0
Эксперт С++
8290 / 6046 / 600
Регистрация: 10.12.2010
Сообщений: 28,115
Записей в блоге: 25
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
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
21.07.2012, 09:56 8

Не по теме:

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

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


Цитата Сообщение от Avazart Посмотреть сообщение
Ну вообще то не содержит ( наследует и не переопределяет)
Ну чисто физически то содержит. И не "не переопределяет", а "не определяет". Ф-ция же чисто виртуальная, она не была определена.
0
116 / 74 / 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
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
21.07.2012, 10:57 10
Цитата Сообщение от -=MASTER=- Посмотреть сообщение
Виртуальная - значит её тут нет и она реализуется в потомках
Разве?
0
116 / 74 / 5
Регистрация: 15.03.2012
Сообщений: 259
21.07.2012, 11:06 11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Разве?
Всё, ты меня уже совсем загрузил со своим полиморфизмом Я уже сам сомневаюсь в своих словах . И так с директ иксом в голове проблем куча
Единственное, чем могу помочь, это точной фразой, приведённой выше:

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

Она появляется при наведение на слово Complex в параметрах функции адд (VS2012)
0
Эксперт С++
8290 / 6046 / 600
Регистрация: 10.12.2010
Сообщений: 28,115
Записей в блоге: 25
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
69 / 63 / 5
Регистрация: 09.06.2012
Сообщений: 291
21.07.2012, 11:30 13
Вроде ж 1 раза в базовам классе достаточно virtual -а,или я неправ ?
0
Jesus loves me
Эксперт С++
5096 / 3110 / 351
Регистрация: 12.12.2009
Сообщений: 7,845
Записей в блоге: 2
21.07.2012, 12:15 14
Цитата Сообщение от xADMIRALx Посмотреть сообщение
Вроде ж 1 раза в базовам классе достаточно virtual -а,или я неправ ?
Да, достаточно. Но если написать virtual в наследнике ошибки не будет, зато стразу видно, что имеется ввиду виртуальная функция. Это повышает читабельность кода.
1
69 / 63 / 5
Регистрация: 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
116 / 74 / 5
Регистрация: 15.03.2012
Сообщений: 259
21.07.2012, 12:39 16
Цитата Сообщение от Kastaneda Посмотреть сообщение
Да, достаточно. Но если написать virtual в наследнике ошибки не будет, зато стразу видно, что имеется ввиду виртуальная функция. Это повышает читабельность кода.
Если в наследнике ты пишешь виртуал тоже, то значит она является виртуальной и для следующего потомства...вроде так.
0
59 / 59 / 8
Регистрация: 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... ??
0
Эксперт С++
8290 / 6046 / 600
Регистрация: 10.12.2010
Сообщений: 28,115
Записей в блоге: 25
21.07.2012, 13:06 18
так ведь писать нельзя..так как класс Pair ничего не знает о классе-потомке Complex... ??
А зачем ему знать?
0
59 / 59 / 8
Регистрация: 29.06.2012
Сообщений: 188
21.07.2012, 13:18 19
Цитата Сообщение от Avazart Посмотреть сообщение
А зачем ему знать?
затем, чтобы компилятор ошибок не выдавал
0
Эксперт С++
8290 / 6046 / 600
Регистрация: 10.12.2010
Сообщений: 28,115
Записей в блоге: 25
21.07.2012, 13:43 20
Ну так что мешает сделать предъявление? Но суть не в том, суть в том что не продумана сама иерархия.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2012, 13:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

Абстрактный класс
Доброго времени суток, нужна помощь с реализацией абстрактного класса &quot;Пользователь библиотеки &quot; в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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