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

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

Войти
Регистрация
Восстановить пароль
 
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
#1

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

04.05.2011, 10:28. Просмотров 1020. Ответов 10
Метки нет (Все метки)

компилятор ругается когда я пытаюсь записать объект класса!!!!
подскажите что я не правильно делаю!!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <cstdlib>
#include <iostream>
#include "FazzyNumber.h" 
 
using namespace std;
 
int main()
{FazzyNumber u1;\\вот тут!!!
 
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//виртуальный класс
#ifndef Pair
#define Pair
 using namespace std;
 
class para{ 
    public:
           double X,e1,e2,a1,a2,a3;
      virtual void composition()=0;
      virtual void subtraction()=0;    
      virtual void multiplication()=0; 
      virtual void division()=0; 
};
 
#endif
основной класс
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
#ifndef CLASS 
#define CLASS 
 
#include <iostream>
#include "Pair.h" 
using namespace std; 
class FazzyNumber: public para{
      public:
        FazzyNumber();
        FazzyNumber(double,double,double);
        FazzyNumber(const FazzyNumber &);
        friend istream& operator >>(istream& , FazzyNumber&);
        friend ostream& operator <<(ostream& , const FazzyNumber&);
 
        void composition(const FazzyNumber&);
        void subtraction(const FazzyNumber&);
 
        //FazzyNumber multiplication(const FazzyNumber& );
       
        //FazzyNumber division(const FazzyNumber& );
   
                                    
};
#endif
метод
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
#include <math.h> 
#include <conio.h>
#include <iostream> 
#include "FazzyNumber.h" 
using namespace std;
FazzyNumber::FazzyNumber(){
X=e1=e2=0;
};
FazzyNumber::FazzyNumber( double X1,double e11, double e21){
X=X1, e1=e11, e2=e21;
};
FazzyNumber::FazzyNumber(const FazzyNumber& u1){
X=u1.X, e1=u1.e1, e2=u1.e2;
};
ostream& operator <<(ostream& out, const FazzyNumber& u){
out<<"("<<u.X<<" , "<<u.e1<<" , "<<u.e2<<")"<<endl;
return out;
};
istream& operator >>(istream& in, FazzyNumber& u){
        do{       if(u.X<0) cout<<"Retype!!!\n";
                  in>>u.X>>u.e1>>u.e2;
        }while(u.X<0);        
        return in;
};
 
void FazzyNumber::composition(const FazzyNumber& u){
     double a1,a2,a3;
     a1=u.X+X-u.e1-e1;
     a2=u.X+X;
     a3=u.X+X+u.e2+e2;
 cout<<"("<<a1<<","<<a2<<","<<a3<<")\n";   
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Нач_физик
2 / 2 / 0
Регистрация: 12.02.2011
Сообщений: 49
04.05.2011, 12:41     абстрактные классы #2
В абстрактном классе 4 чистые виртуальные функции, в производном определены только
void composition(const FazzyNumber&);
void subtraction(const FazzyNumber&); следовательно
virtual void multiplication()=0;
virtual void division()=0;
наследуются от родителя как чистые виртуальные, и сам класс наследник становится абстрактным классом, обект которого нельзя создать, потому и ругается
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
04.05.2011, 19:45  [ТС]     абстрактные классы #3
не могу понять сделал как ты сказал, но у меня он все ровно на что то ругается!!
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
04.05.2011, 19:56     абстрактные классы #4
Цитата Сообщение от 2008kedr2008 Посмотреть сообщение
но у меня он все ровно на что то ругается!!
"Он" не может ругаться на что-то, "Он" ругается только на вполне конкретные вещи) Выложи список ошибок, понятней будет.
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
04.05.2011, 20:06  [ТС]     абстрактные классы #5
[Linker error] undefined reference to `vtable for para'
[Linker error] undefined reference to `para::composition()'
ld returned 1 exit status
ну вот как то так

Добавлено через 3 минуты
я эти исправил теперь не могу создать в main объект класса

Добавлено через 1 минуту
8 D:\прога\67\main.cpp cannot declare variable `t1' to be of type `FazzyNumber'
8 D:\прога\67\main.cpp because the following virtual functions are abstract:
9 D:\прога\67\Pair.h virtual void para::composition()
теперь мне вот эти покоя не дают!!!
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
04.05.2011, 20:10     абстрактные классы #6
Это ошибки линкера. Он не может "привязать" `vtable for para' и `para::composition()'. Возможно они объявлены, но не определены или что-нибудь в этом духе. Без кода сложно сказать.

Добавлено через 2 минуты
Цитата Сообщение от 2008kedr2008 Посмотреть сообщение
8 D:\прога\67\main.cpp cannot declare variable `t1' to be of type `FazzyNumber'
8 D:\прога\67\main.cpp because the following virtual functions are abstract:
9 D:\прога\67\Pair.h virtual void para::composition()
теперь мне вот эти покоя не дают!!!
Не может создать объект, потому что ф-ция void para::composition() "абстракная" (похоже имеется ввиду "чисто виртуальная")
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
04.05.2011, 20:10  [ТС]     абстрактные классы #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*main.h*/
#include <cstdlib>
#include <iostream>
#include "FazzyNumber.h" 
 
using namespace std;
 
int main()
{FazzyNumber t1;
//cout<<u1.composition(u2);
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*абстрактный класс*/
#ifndef Pair
#define Pair
 
 using namespace std;
 
class para{ 
    public:
           double X,e1,e2,a1,a2,a3;
     virtual void composition()=0;
     //virtual FazzyNumber composition(FazzyNumber);  
     //virtual FazzyNumber multiplication(FazzyNumber);
     //virtual  FazzyNumber division(FazzyNumber);
};
 
#endif
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
/*произвольный класс*/
#ifndef CLASS 
#define CLASS 
 
#include <iostream>
#include "Pair.h" 
using namespace std; 
class FazzyNumber: public para{
      public:
        FazzyNumber();
        FazzyNumber(double,double,double);
        FazzyNumber(const FazzyNumber &);
        friend istream& operator >>(istream& , FazzyNumber&);
        friend ostream& operator <<(ostream& , const FazzyNumber&);
 
        virtual void composition(const FazzyNumber&);
        ///FazzyNumber subtraction(const FazzyNumber& );
        //FazzyNumber multiplication(const FazzyNumber& );
        //FazzyNumber reverseA();
        //FazzyNumber division(const FazzyNumber& );
 
                                    
};
#endif
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
/*метод произвольного класса*/
#include <math.h> 
#include <conio.h>
#include <iostream> 
#include "FazzyNumber.h" 
using namespace std;
FazzyNumber::FazzyNumber(){
X=e1=e2=0;
};
FazzyNumber::FazzyNumber( double X1,double e11, double e21){
X=X1, e1=e11, e2=e21;
};
FazzyNumber::FazzyNumber(const FazzyNumber& u1){
X=u1.X, e1=u1.e1, e2=u1.e2;
};
ostream& operator <<(ostream& out, const FazzyNumber& u){
out<<"("<<u.X<<" , "<<u.e1<<" , "<<u.e2<<")"<<endl;
return out;
};
istream& operator >>(istream& in, FazzyNumber& u){
        do{       if(u.X<0) cout<<"Retype!!!\n";
                  in>>u.X>>u.e1>>u.e2;
        }while(u.X<0);        
        return in;
};
 
void FazzyNumber::composition(const FazzyNumber& u){
     double a,b,c;
     a=u.X+X-u.e1-e1;
     b=u.X+X;
     c=u.X+X+u.e2+e2;
            cout<<"("<<a<<","<<b<<","<<c<<"0\n";
};
Добавлено через 34 секунды
ну да, она виртуальная, так задумывалось!!
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
04.05.2011, 20:13     абстрактные классы #8
Попробуй вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*абстрактный класс*/
#ifndef Pair
#define Pair
 
 using namespace std;
 
class para{ 
    public:
           double X,e1,e2,a1,a2,a3;
     virtual void composition(const FazzyNumber&)=0;
     //virtual FazzyNumber composition(FazzyNumber);  
     //virtual FazzyNumber multiplication(FazzyNumber);
     //virtual  FazzyNumber division(FazzyNumber);
};
 
#endif
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
04.05.2011, 20:16  [ТС]     абстрактные классы #9
пробовал
вот результат!!
9 D:\прога\67\Pair.h expected `,' or `...' before '&' token //это как я понял он на амперсант ругается
9 D:\прога\67\Pair.h ISO C++ forbids declaration of `FazzyNumber' with no type //а это он типа переменной FazzyNumber не знает.....
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
04.05.2011, 20:35     абстрактные классы #10
Да, тупанул) Вот так нужно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*абстрактный класс*/
#ifndef Pair
#define Pair
 
 using namespace std;
class FazzyNumber;
class para{
    public:
           double X,e1,e2,a1,a2,a3;
     virtual void composition(const FazzyNumber&)=0;
     //virtual FazzyNumber composition(FazzyNumber);
     //virtual FazzyNumber multiplication(FazzyNumber);
     //virtual  FazzyNumber division(FazzyNumber);
};
 
#endif
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2011, 20:37     абстрактные классы
Еще ссылки по теме:

C++ Абстрактные классы
C++ Абстрактные классы
Абстрактные и производные классы С++ C++
абстрактные классы C++
Абстрактные классы C++

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

Или воспользуйтесь поиском по форуму:
2008kedr2008
3 / 3 / 0
Регистрация: 16.11.2010
Сообщений: 165
04.05.2011, 20:37  [ТС]     абстрактные классы #11
о чудо скомпилировал=)))) а как в main.cpp организовать вывод?? подскажи пожалуйста!!
Yandex
Объявления
04.05.2011, 20:37     абстрактные классы
Ответ Создать тему
Опции темы

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