0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
1

Невозможно создать экземпляр абстрактного класса

14.01.2012, 15:51. Показов 17627. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю курсовик, сейчас на начальной стадии (а как же еще к концу сессии ). Код, который я сейчас покажу еще "сырой", а точнее нарезка из лаб за семестр и и тп. Пока отлаживаю просто создание объекта и пытаюсь запихать его в контейнер(шаблонный класс, который сам же и написал "список"). Объект суть производный класс из абстрактного. В мэйне при инициализации объекта возникает ошибка от компилятора "String:Невозможно создать экземпляр абстрактного класса". В общем как это сделать?
//--------------------------------main------------------------------------------
C++
1
2
3
4
5
6
7
8
9
#include "list.h"
 
void main()
{   list<String> A;
    cout<<"win"<<endl;
    String* a;
    a=new String("qwerty");
    A.add(a);
}
//------------------------------------описание классов----------------------------------------

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
#include <iostream>
#include <time.h>
#include <malloc.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <fstream>
using namespace std;
const char NONAME[]="NONAME";
const char STRINGNAME[]="String";
const char INTNAME[]="Int";
const char FLOATNAME[]="Float";
 
// Абстрактный класс - родитель классов, которые можно сохранять в коллекции
 
class object
{
public:
    char *className;// имя класса
    int sz2;
    int classUID;// уникальный идентификатор класса
    object(){classUID=0;};
    virtual ~object(){};
    virtual int GetUID() = 0;// получение УИК
    virtual char* GetName() = 0;// получение имени класса
 
    virtual int readbin(ifstream &ff) = 0;// чтение из бинарного файла
    virtual int writebin(ofstream &ff) = 0;// запись в бинарный файл
 
    virtual bool Load(char *buf) = 0;// загрузка из строки
    virtual bool Upload(char *buf) = 0;// выгрузка в строку
 
    virtual int Compar(object *rhs) = 0;// сравнение с другим объектом
 
    virtual void Union(object *rhs) = 0;// объединение с другим объектом
 
    virtual void Show(ostream &os = cout) = 0;// вывод в поток
    object *next,*prev;
};
class String: public object
{
public:
    char *str;  // Массив для хранения строки
    int sz;     // Размерность массива
    String();                                       // Конструктор по умолчанию
    String(char *s);                                // Конструктор с параметрами
    String(const String &rhs);                      // Конструктор копирования
    virtual ~String();              // Деструктор
    void add(const char *ns);                       // Добавление строки
    virtual void change(const char *ns);                    // Изменение строки
    virtual void print();                   // Вывод
    virtual int readbin(ifstream &ifs);                     // Чтение и запиcь в двоичный файл
    virtual int write(ofstream &ofs);
    operator char*();                               // Преобразование в строку
    //friend ostream& operator<< (ostream& os,const String& r); // Потоковый ввод/вывод
    //friend istream& operator>> (istream& is,String& r);
 
};
 
class Int: public object
{
    protected:
    Int *next,*prev;// указатели на следующий и предыдущий элементы списка
public:
    int date;   //поле данных
    
    Int();                                      // Конструктор по умолчанию
    Int(int a);                             // Конструктор с параметрами
    Int(const Int &rhs);                        // Конструктор копирования
    virtual ~Int();             // Деструктор
    virtual void change(int ns);                    // Изменение строки
    virtual void print();                   // Вывод
    virtual int readbin(ifstream &ifs);                     // Чтение и запиcь в двоичный файл
    virtual int write(ofstream &ofs);
    //friend ostream& operator<< (ostream& os,const String& r); // Потоковый ввод/вывод
    //friend istream& operator>> (istream& is,String& r);
 
};

//-----------------------------------методы-------------------------------------

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "head.h"
 
String::String()
{           // Конструктор по умолчанию
    sz=1;
    str=new char[sz];       // Создать массив
    str[0]='\0';
    next=prev=NULL;
    classUID=1;
    sz2=strlen(STRINGNAME)+1;
    className=new char[sz2];
    strcpy(className,STRINGNAME);
//  cout << endl << "\t\t*** Default constructor-1 parclass" << endl;
    
}
 
 
String::String(char *s){        // Конструктор  с параметрами
    sz=strlen(s)+1; // Вычислить длину масива и создать его
    str=new char[sz];
    strcpy(str,s);              // Скопировать строку
    next=prev=NULL;
    classUID=1;
    sz2=strlen(STRINGNAME)+1;
    className=new char[sz2];
    strcpy(className,STRINGNAME);
//  cout << endl << "\t\t*** Constructor with parameters-1 parclass" << endl;
}
 
 
String::String(const String &rhs){  // Конструктор копирования
    sz=rhs.sz;                      // Создать массив той же размерности, что и у переданного объекта 
    str=new char[sz];               
    strcpy(str,rhs.str);            // Скопировать строку
    next=prev=NULL;
    classUID=1;
    sz2=strlen(STRINGNAME)+1;
    className=new char[sz2];
    strcpy(className,STRINGNAME);
//  cout << endl << "\t\t*** Copy constructor-1 parclass" << endl;
}
 
 
String::~String()
{                   // Деструктор
    delete []str;                   // Удалить его
    delete []className;
//  cout << endl << "\t\t*** Destructor-1 parclass" << endl;
}
 
 
void String::add(const char *ns){       // Добавление строки
    int ss=strlen(ns);
    char *nstr=new char[sz+ss];         // Создать новый массив необходимой длины
    strcpy(nstr,str);                   // Скопировать исходную строку
    strcat(nstr,ns);                    // Дополнить новой строкой
    str=nstr;                           // Запомнить новый массив
    sz+=ss;
}
 
 
void String::change(const char *ns){        // Изменение строки
    int ss=strlen(ns);
    delete []str;               // Удалить старый массив
    str=new char[ss+1];         // Создать новый
    strcpy(str,ns);                         // Скопировать строку
}
 
void String::print()
{           // Вывод 
    cout << str<<endl;                          // Вывести строку
}
 
 
String::operator char*() // преобразование в строку
{
    return strdup(str);
}
 
ostream& operator<< (ostream& os,const String& r) // вывод в поток
 
{
    os << r.str;
    return os;
}
 
 
istream& operator>> (istream& is,String& r){
    char buf[1000];
    is >> buf;                                  // Прочитать строку из потока
 
    int ss=strlen(buf);
    int *n;
 
    delete [](r.str);               
    r.str=new char[ss+1];           
 
    n=(int*)r.str;
 
    strcpy(r.str,buf);                      
    r.sz=ss+1;
 
    return is;
}
 
 
 
int String::readbin(ifstream &ifs){     // Чтение из двоичного файла
    int s;
    ifs.read((char*)&s,sizeof(int));    
    delete []str;               
    str=new char[s+1];              
    ifs.read(str,s*sizeof(char));   
    str[s]='\0';
    sz=s+1;
 
    return 1;
}
 
 
int String::write(ofstream &ofs)
{       // Запись в двоичный файл
    int n=(strlen(str));
    ofs.write((char*)&n,sizeof(int));
    ofs.write((char*)str,n*sizeof(char));
 
    return 1;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2012, 15:51
Ответы с готовыми решениями:

Невозможно создать экземпляр абстрактного класса
work.cpp #include &quot;student.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt;...

error C2259: last: невозможно создать экземпляр абстрактного класса
Только начала изучать абстрактные классы, и сразу же проблемы. error C2259: last: невозможно...

error C2259: number_of_plants: невозможно создать экземпляр абстрактного класса
error C2259: number_of_plants: невозможно создать экземпляр абстрактного класса Пожалуйста,...

как исправить Ошибка 8 error C2259: Tabl: невозможно создать экземпляр абстрактного класса
имеется абстрактный класс, у нее есть 4 виртуальных функций: запись и чтение с помощью С и С++...

20
15 / 15 / 8
Регистрация: 01.09.2011
Сообщений: 65
14.01.2012, 16:00 2
может в производном классе должны быть определены копии всех виртуальных функций?
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:04  [ТС] 3
Нет. тоже самое.=)
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
14.01.2012, 16:08 4
Ну вопервых
C++
1
2
3
4
5
virtual bool Load(char *buf) = 0;// загрузка из строки
virtual bool Upload(char *buf) = 0;// выгрузка в строку
virtual int Compar(object *rhs) = 0;// сравнение с другим объектом
virtual void Union(object *rhs) = 0;// объединение с другим объектом
virtual void Show(ostream &os = cout) = 0;// вывод в поток
эти определения обозначают что реализация будет в наследуемых классах, я что её не нашел
во вторых
конструктор по умолчанию в наследумых классах зачем?
вообщем я бы на вашем месте переписал все по новой
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:12  [ТС] 5
Цитата Сообщение от fridi Посмотреть сообщение
Ну вопервых
C++
1
2
3
4
5
virtual bool Load(char *buf) = 0;// загрузка из строки
virtual bool Upload(char *buf) = 0;// выгрузка в строку
virtual int Compar(object *rhs) = 0;// сравнение с другим объектом
virtual void Union(object *rhs) = 0;// объединение с другим объектом
virtual void Show(ostream &os = cout) = 0;// вывод в поток
эти определения обозначают что реализация будет в наследуемых классах, я что её не нашел
во вторых
конструктор по умолчанию в наследумых классах зачем?
вообщем я бы на вашем месте переписал все по новой
она есть уже, но все равно не катит
я и так делаю все по новой уже 3 раз
0
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
14.01.2012, 16:14 6
Цитата Сообщение от Akkoks Посмотреть сообщение
она есть уже, но все равно не катит
я и так делаю все по новой уже 3 раз
ПЕРЕОПРЕДЕЛИТЕ функции базового класса в классе-наследнике
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:18  [ТС] 7
Цитата Сообщение от Mayonez Посмотреть сообщение
ПЕРЕОПРЕДЕЛИТЕ функции базового класса в классе-наследнике
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
class String: public object
{
public:
    char *str;  // Массив для хранения строки
    int sz;     // Размерность массива
    String();                                       // Конструктор по умолчанию
    String(char *s);                                // Конструктор с параметрами
    String(const String &rhs);                      // Конструктор копирования
    virtual ~String();              // Деструктор
    void add(const char *ns);                       // Добавление строки
    void change(const char *ns);                    // Изменение строки
    void print();                   // Вывод
 
    virtual int GetUID();// получение УИК
    virtual char* GetName();// получение имени класса
 
    virtual int readbin(ifstream &ff);// чтение из бинарного файла
    virtual int writebin(ofstream &ff);// запись в бинарный файл
 
    virtual bool Load(char *buf);// загрузка из строки
    virtual bool Upload(char *buf);// выгрузка в строку
 
    virtual int Compar(String *rhs);// сравнение с другим объектом
 
    virtual void Union(String *rhs);// объединение с другим объектом
 
    virtual void Show(ostream &os = cout);// вывод в поток
    operator char*();                               // Преобразование в строку
    //friend ostream& operator<< (ostream& os,const String& r); // Потоковый ввод/вывод
    //friend istream& operator>> (istream& is,String& r);
 
};
вот, пожалуйста =) все равно не работает=)
0
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
14.01.2012, 16:21 8
Цитата Сообщение от Akkoks Посмотреть сообщение
вот, пожалуйста =) все равно не работает=)
а их реализация?

Добавлено через 38 секунд
и по-моему они не должны быть виртуальными...
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:25  [ТС] 9
Цитата Сообщение от Mayonez Посмотреть сообщение
а их реализация?

Добавлено через 38 секунд
и по-моему они не должны быть виртуальными...
Реализация не обязательнА, пока я ими не буду пользоваться...
Да, по моему тоже, но разве тогда они не буду считаться, как "свои" функции производного класса?
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
14.01.2012, 16:26 10
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
class String: public object
{
public:
        char *str;      // Массив для хранения строки
        int sz;         // Размерность массива
        String();                                                                               // Конструктор по умолчанию
        String(char *s);                                                                // Конструктор с параметрами
        String(const String &rhs);                                              // Конструктор копирования
        virtual ~String();                              // Деструктор
        void add(const char *ns);                                               // Добавление строки
        void change(const char *ns);                                    // Изменение строки
    void print();                                       // Вывод
 
        virtual int GetUID(){};// получение УИК
        virtual char* GetName(){};// получение имени класса
 
        virtual int readbin(ifstream &ff){};// чтение из бинарного файла
        virtual int writebin(ofstream &ff){};// запись в бинарный файл
 
        virtual bool Load(char *buf){};// загрузка из строки
        virtual bool Upload(char *buf){};// выгрузка в строку
 
        virtual int Compar(String *rhs){};// сравнение с другим объектом
 
        virtual void Union(String *rhs){};// объединение с другим объектом
 
        virtual void Show(ostream &os = cout){};// вывод в поток
        operator char*();                                                               // Преобразование в строку
        //friend ostream& operator<< (ostream& os,const String& r);     // Потоковый ввод/вывод
    //friend istream& operator>> (istream& is,String& r);
 
};
Так работает?
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:28  [ТС] 11
Цитата Сообщение от fridi Посмотреть сообщение
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
class String: public object
{
public:
        char *str;      // Массив для хранения строки
        int sz;         // Размерность массива
        String();                                                                               // Конструктор по умолчанию
        String(char *s);                                                                // Конструктор с параметрами
        String(const String &rhs);                                              // Конструктор копирования
        virtual ~String();                              // Деструктор
        void add(const char *ns);                                               // Добавление строки
        void change(const char *ns);                                    // Изменение строки
    void print();                                       // Вывод
 
        virtual int GetUID(){};// получение УИК
        virtual char* GetName(){};// получение имени класса
 
        virtual int readbin(ifstream &ff){};// чтение из бинарного файла
        virtual int writebin(ofstream &ff){};// запись в бинарный файл
 
        virtual bool Load(char *buf){};// загрузка из строки
        virtual bool Upload(char *buf){};// выгрузка в строку
 
        virtual int Compar(String *rhs){};// сравнение с другим объектом
 
        virtual void Union(String *rhs){};// объединение с другим объектом
 
        virtual void Show(ostream &os = cout){};// вывод в поток
        operator char*();                                                               // Преобразование в строку
        //friend ostream& operator<< (ostream& os,const String& r);     // Потоковый ввод/вывод
    //friend istream& operator>> (istream& is,String& r);
 
};
Так работает?


К сожалению нет тем более всю реалезацию я уже добавил в методах...
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
14.01.2012, 16:29 12
Листинг ошибок скиньте сюды
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:38  [ТС] 13
Цитата Сообщение от fridi Посмотреть сообщение
Листинг ошибок скиньте сюды
ну в вашем примере возникла куча ошибок из-за того, что многие функции должны возвращать значение
а без пустых реализаций только одна ошибка

Ошибка 1 error C2259: String: невозможно создать экземпляр абстрактного класса c:\локальный диск\универ\c++\kursach3\kursach3\main.cpp 7 kursach3

Добавлено через 5 минут
Вот тут пример из презентации, по которой нам ведут лекции (какой ужас, не правда ли?)

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
class Person {  // Абстрактный класс
public:
Person() {  
       strcpy(name,"NONAME"); age=0; next=0; }
Person(char*NAME,int AGE) {  strcpy(name,NAME); age=AGE; next=0; }
virtual~Person(){};
virtual void Show()=0;
virtual void Input()=0;
friend class List;     //для доступа в List к next
protected:
char name[20];       //имя
int age;             //возраст
Person* next;       
};
class Student: public Person{  //Студент
public:
Student() {grade=0;}
Student(char* NAME,int AGE, float GRADE): Person(NAME,AGE) 
       {grade=GRADE; }
void Show() {
        cout<<"name="<<name<<"            
        age="<<age<<"grade="<<grade<<endl;}
void Input() {
         cout<<"name=";cin>>name;
         cout<<"age=";cin>>age;
         cout<<"grade=";cin>>grade;
}
protected:
float grade;        //рейтинг
};
class Teacher: public Person{  // Преподаватель
public:   Teacher() {work=0;}
Teacher(char* NAME,int AGE,int WORK):
       Person(NAME,AGE) { work=WORK;}
void Show(){cout<<"name="<<name<<"  age="<<age<<"  work="<<work<<endl;}
void Input() {
        cout<<"name=";cin>>name;
        cout<<"age=";cin>>age;
        cout<<"work=";cin>>work;
}
protected:  int work;   //стаж
};
 
class List {
       private: Person* begin;
public:
       List()   {begin=0;}
       ~List();
       void Insert(Person*);
       void Show();
};
List::~List() { 
       Person*r;
    while(begin!=0){ 
               r=begin; begin=begin->next; delete r;}
}
void List::Insert(Person*p){
       Person *r;
       r=begin; begin=p; p->next=r;   }
void List::Show() {
       Person *r;
        r=begin;
        while(r!=0) {r->Show(); r=r->next;} 
}
 
void main() {
      List list;
    Student* ps;
    Teacher* pt;
    ps=new Student("Иванов",21,50.5);
    list.Insert(ps);
    pt=new Teacher("Котов",34,10);
    list.Insert(pt);
    ps=new Student();  ps->Input();
    list.Insert(ps);
    pt=new Teacher();  pt->Input();
    list.Insert(pt);
    list.Show();
}
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:49  [ТС] 14
Цитата Сообщение от fridi Посмотреть сообщение
C++
1
2
3
 String* a;
 a=new String("qwerty");
 A.add(a);
тут ошибка a->add("foo"); примерно так должно быть верните все как было
окей, теперь при дебаге вылетает на

a->add("foo"); чудеса...
Run-Time Check Failure #3 - The variable 'a' is being used without being initialized. вот ошибка дебага
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
14.01.2012, 17:18 15
вот подправил вроде все ок должно быть
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <fstream>
using namespace std;
const char NONAME[]="NONAME";
const char STRINGNAME[]="String";
const char INTNAME[]="Int";
const char FLOATNAME[]="Float";
 
// Абстрактный класс - родитель классов, которые можно сохранять в коллекции
 
class object
{
public:
        char *className;// имя класса
        int sz2;
        int classUID;// уникальный идентификатор класса
        object(){classUID=0;};
        virtual ~object(){};
        virtual int GetUID() = 0;// получение УИК
        virtual char* GetName() = 0;// получение имени класса
 
        virtual int readbin(ifstream &ff) = 0;// чтение из бинарного файла
        virtual int writebin(ofstream &ff) = 0;// запись в бинарный файл
 
        virtual bool Load(char *buf) = 0;// загрузка из строки
        virtual bool Upload(char *buf) = 0;// выгрузка в строку
 
        virtual int Compar(object *rhs) = 0;// сравнение с другим объектом
 
        virtual void Union(object *rhs) = 0;// объединение с другим объектом
 
        virtual void Show(ostream &os = cout) = 0;// вывод в поток
        object *next,*prev;
};
class String: public object
{
public:
        char *str;      // Массив для хранения строки
        int sz;         // Размерность массива
        String(){};                                                                               // Конструктор по умолчанию
        String(char *s){};                                                                // Конструктор с параметрами
        String(const String &rhs){};                                              // Конструктор копирования
         ~String(){};                              // Деструктор
        void add(const char *ns);                                               // Добавление строки
        virtual int GetUID() {return 0;};// получение УИК
        virtual char* GetName() {return "foo";};// получение имени класса
 
        virtual int readbin(ifstream &ff) {return 0;};// чтение из бинарного файла
        virtual int writebin(ofstream &ff){return 0;};// запись в бинарный файл
 
        virtual bool Load(char *buf) {return 0;};// загрузка из строки
        virtual bool Upload(char *buf) {return 0;};// выгрузка в строку
 
        virtual int Compar(object *rhs) {return 0;};// сравнение с другим объектом
 
        virtual void Union(object *rhs) {};// объединение с другим объектом
 
        virtual void Show(ostream &os = cout) {};// вывод в поток                                                            // Преобразование в строку
        //friend ostream& operator<< (ostream& os,const String& r);     // Потоковый ввод/вывод
    //friend istream& operator>> (istream& is,String& r);
 
};
 
class Int: public object
{
        protected:
        Int *next,*prev;// указатели на следующий и предыдущий элементы списка
public:
        int date;       //поле данных
 
        Int();                                                                          // Конструктор по умолчанию
        Int(int a);                                                             // Конструктор с параметрами
        Int(const Int &rhs);                                            // Конструктор копирования
        virtual ~Int();                         // Деструктор
        virtual void change(int ns);                                    // Изменение строки
        virtual void print();                                   // Вывод
        virtual int readbin(ifstream &ifs);                                             // Чтение и запиcь в двоичный файл
        virtual int write(ofstream &ofs);
        //friend ostream& operator<< (ostream& os,const String& r);     // Потоковый ввод/вывод
        //friend istream& operator>> (istream& is,String& r);
 
};
 
int main()
{
 
  String s("qwerty");
 
 
}
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
14.01.2012, 17:29 16
Чисто виртуальная ф-я, которая не определена в производном классе(String), остается чисто виртуальной, поэтому такой класс, как и базовый(Object), является абстрактным.
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 17:30  [ТС] 17
Цитата Сообщение от fridi Посмотреть сообщение
вот подправил вроде все ок должно быть
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
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <fstream>
using namespace std;
const char NONAME[]="NONAME";
const char STRINGNAME[]="String";
const char INTNAME[]="Int";
const char FLOATNAME[]="Float";
 
// Абстрактный класс - родитель классов, которые можно сохранять в коллекции
 
class object
{
public:
        char *className;// имя класса
        int sz2;
        int classUID;// уникальный идентификатор класса
        object(){classUID=0;};
        virtual ~object(){};
        virtual int GetUID() = 0;// получение УИК
        virtual char* GetName() = 0;// получение имени класса
 
        virtual int readbin(ifstream &ff) = 0;// чтение из бинарного файла
        virtual int writebin(ofstream &ff) = 0;// запись в бинарный файл
 
        virtual bool Load(char *buf) = 0;// загрузка из строки
        virtual bool Upload(char *buf) = 0;// выгрузка в строку
 
        virtual int Compar(object *rhs) = 0;// сравнение с другим объектом
 
        virtual void Union(object *rhs) = 0;// объединение с другим объектом
 
        virtual void Show(ostream &os = cout) = 0;// вывод в поток
        object *next,*prev;
};
class String: public object
{
public:
        char *str;      // Массив для хранения строки
        int sz;         // Размерность массива
        String(){};                                                                               // Конструктор по умолчанию
        String(char *s){};                                                                // Конструктор с параметрами
        String(const String &rhs){};                                              // Конструктор копирования
         ~String(){};                              // Деструктор
        void add(const char *ns);                                               // Добавление строки
        virtual int GetUID() {return 0;};// получение УИК
        virtual char* GetName() {return "foo";};// получение имени класса
 
        virtual int readbin(ifstream &ff) {return 0;};// чтение из бинарного файла
        virtual int writebin(ofstream &ff){return 0;};// запись в бинарный файл
 
        virtual bool Load(char *buf) {return 0;};// загрузка из строки
        virtual bool Upload(char *buf) {return 0;};// выгрузка в строку
 
        virtual int Compar(object *rhs) {return 0;};// сравнение с другим объектом
 
        virtual void Union(object *rhs) {};// объединение с другим объектом
 
        virtual void Show(ostream &os = cout) {};// вывод в поток                                                            // Преобразование в строку
        //friend ostream& operator<< (ostream& os,const String& r);     // Потоковый ввод/вывод
    //friend istream& operator>> (istream& is,String& r);
 
};
 
class Int: public object
{
        protected:
        Int *next,*prev;// указатели на следующий и предыдущий элементы списка
public:
        int date;       //поле данных
 
        Int();                                                                          // Конструктор по умолчанию
        Int(int a);                                                             // Конструктор с параметрами
        Int(const Int &rhs);                                            // Конструктор копирования
        virtual ~Int();                         // Деструктор
        virtual void change(int ns);                                    // Изменение строки
        virtual void print();                                   // Вывод
        virtual int readbin(ifstream &ifs);                                             // Чтение и запиcь в двоичный файл
        virtual int write(ofstream &ofs);
        //friend ostream& operator<< (ostream& os,const String& r);     // Потоковый ввод/вывод
        //friend istream& operator>> (istream& is,String& r);
 
};
 
int main()
{
 
  String s("qwerty");
 
 
}











дело в том, что у меня есть шаблонный класс, для которого нужно получать указатель на объект, иначе, в тех строках где T *d (если убрать *) возникает ошибка, что невозможно создать бла бла бла абстрактного класса...
по этому инициализация должна быть String *a;

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "head.h"
 
template <class T> class list
{
   class Elem//объект, который будет хранить данные типов
   {
       public:
         T *data;//поле с данными
         Elem * next;//указатели на следующий и предыдущий элемент
         Elem * prev;
         Elem(){data = 0; next = prev = NULL;}//констурктор
         Elem(T *d):data(d){next = prev = NULL;}//конструктор с параметрами
   };
   int size;//размерность списка
   Elem * head;//указатели на начало и конец списка
   Elem * end;
   public:
      list(){head = end = NULL; size=0;}; //конструктор по умолчанию
      ~list()
      {
          Elem * pt = head;
      while(pt->next!=NULL)
          {
              Elem * t = pt;
              pt = pt->next;
              delete t;
           }
}
void add(T *d)// вставка в конец списка
{
       Elem * t = new Elem(d);
        if ( head == NULL ) 
        {
             head = end = t;
             t->next=NULL;
             cout<<"Insert in head"<<endl;
             size=1;
        }
        else      {
              t->prev = end;
              end->next = t;
              end = t;
              t->next=NULL;
              cout<<"Insert in end"<<endl;
              size++;
        }
}
 
void print()  //вывод списка
{
       Elem * pt = head;
       while(pt->next!=NULL)
       {
            pt->data.print();
            pt = pt->next;
       }
}
void include(int num,T *d)//включение объекта по логическому номеру
{
    try
    {
    if(num<0||num>size-1) throw "Invalid number";
    
    else 
    {
        Elem *t=head,*pt=new Elem(d);
        int i=0;
        do 
        {
            t=t->next;
            i++;
        } while(t!=head && i<num);
 
        pt->prev=t->prev;
        t->prev->next=pt;
        pt->next=t;
        t->prev=pt;
    }
    }
    catch (char *s)
    {
        cout<<s<<endl;
    }
}
void exclude(int num)//исключение объекта из списка по логическому номеру
{
    try
    {
    if(num<0||num>size-1) throw "Invalid number";
    
    else 
    {
        if(num==0)//если первый элемент в списке
        {
            Elem *t=head;
            Elem *tt;
            tt=t->next;
            delete t;
            tt->prev=NULL;
            head=tt;
        }
        if(num==size-1)//если последний элемент в списке
        {
            Elem *t=end;
            Elem *tt;
            tt=t->prev;
            delete t;
            tt->next=NULL;
            end=tt;
        }
        if(num!=0&&num!=size)
        {
        Elem *t=head;
        int i=0;
        do 
        {
            t=t->next;
            i++;
        } while(t!=head && i<num);
 
        t->prev->next=t->next;
        t->next->prev=t->prev;
        delete t;
        }
    }
    }
    catch (char *s)
    {
        cout<<s<<endl;
    }
}
void search(int num) //поиск элемента по логисескому номеру
{
    try
    {
    if(num<0||num>size) throw "Invalid number";
    
    else 
    {
        Elem *t=head;
        int i=0;
        do 
        {
            t=t->next;
            i++;
        } while(t!=head && i<num);
 
        cout <<i<<":"<<; t->data.print(); cout<<endl;
    }
    }
    catch (char *s)
    {
        cout<<s<<endl;
    }
}
};
0
3 / 3 / 1
Регистрация: 10.05.2011
Сообщений: 19
14.01.2012, 17:36 18

Будут считаться) Как раз смысл чистых виртуальных в том и заключается, чтобы их переопределяли как нормальные.
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 18:39  [ТС] 19
В общем нашел в чем трабл...
Все методы, где передается параметр String надо либо удалить, либо параметр поменять на object.
что из этого верно я пока не определил
fridi большое спасибо
0
1 / 1 / 0
Регистрация: 20.05.2016
Сообщений: 47
17.12.2018, 16:01 20
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <iostream>
#include<conio.h>
#include<string>
 
using namespace std;
 
class Worker {
private:
    std::string fname;
    long id;
protected:
    virtual void Data()const {
        cout << "name: " << fname << endl;
        cout <<"id: "  << id << endl;
    };
    virtual void Get() {
        getline(cin, fname);
        cout << "Enter ID: ";
        cin >> id;
        while (cin.get() != '\n')
            continue;
    }
        
public:
    Worker() :fname("no name"), id(0L) {
 
    }
    Worker(const std::string &s, long n): fname(s), id(n) {
    
    };
    virtual void Set() =0;
    virtual void show()const=0;
};
//--------------
class Waiter: virtual public Worker {
private:
    int panache;
protected:
     void Data()const {
        cout << "panache rating: " << panache << endl;
    };
     void Get() {
        cout << "Enter waiter`s panache rating: ";
        cin >> panache;
        while (cin.get() != '\n')
            continue;
    };
public:
    Waiter()                                       :Worker(),     panache(0) {};
    Waiter(const std::string s, long n, int p = 0) :Worker(s, n), panache(p) {};
    Waiter(const Worker &wk,            int p = 0) :Worker(wk),   panache(p) {};
     void set() {
        cout << "Enter waiter name: ";
        Worker::Get();
        Get();
    };
     void show()const {
        cout << "Category: waiter\n";
        Worker::Data();
        Data();
    };
};
//--------------
class Singer :virtual public Worker {
protected:
    enum{other, alto, contralto, soprano, bass, baritone, tenor};
    enum { vtypes = 7 };
     void Data()const { cout << "Vocal range: " << pv[voice] << endl; };
     void Get() { cout << "Enter number for singer vocal range: \n";
    int i;
    for (i = 0; i < vtypes; i++)
    {
        cout << i << ": " << pv[i] << " ";
        if (i % 4 == 3) cout << endl;
    }
    if (i % 4 != 0)cout << endl;
    cin >> voice;
    while (cin.get()!='\n')
    {
        continue;
    }
    };
private:
    static const char *pv[vtypes];
    int voice;
public  :
    Singer()                                            : Worker(),     voice(other) {};
    Singer(const std::string &s, long n, int v = other) : Worker(s,n),  voice(v)     {};
    Singer(const Worker &wk,             int v = other) : Worker(wk),   voice(v)     {};
     void set() {
        cout << "Enter singer name: ";
        Worker::Get();
        Get();
    };
     void show()const {
        cout << "Category: songer\n";
        Worker::Data();
        Data();
    };
};
const char * Singer::pv[Singer::vtypes] = { "Other", "alto","contralto","soprano","bass","bbaritone", "tenor" };
//==================
class SingerWaiter :public Waiter, public Singer {
protected:
    virtual void Data()const {
        Singer::Data();
        Waiter::Data();
    };
    virtual void Get() {
        Waiter::Get();
        Singer::Get();
    };
public:
    SingerWaiter(){};
    SingerWaiter(const std::string &s, long n, int p = 0, int v = other)    : Worker(s, n), Waiter(s, n, p),    Singer(s, n, v)     {};
    SingerWaiter(const Worker &wk,             int p = 0, int v = other)    : Worker(wk),   Waiter(wk,   p),    Singer(wk,   v)     {};
    SingerWaiter(const Waiter &wtr,                       int v = other)    : Worker(wtr),  Waiter(wtr),        Singer(wtr,  v)     {};
    SingerWaiter(const Singer & sn,            int p = 0)                   : Worker(sn),   Waiter(sn,   p),    Singer(sn)          {};
     void set()      {
        cout << "Enter singing waiter name: ";
        Worker::Get();
        Get();
    };
     void show()const {
        cout << "Category: singing waiter \n";
        Worker::Data();
        Data();
    };
};
/***********************************************************************************/
 
int main()
{
    const int SIZE = 5;
    Worker * lolas[SIZE];
    lolas[0] = new Singer;
    lolas[1] = new Waiter;
 
    
    _getch();
 }
Та же самая ошибка невозможно создать экземпляр абстрактного класса
в чем может быть ошибка?
Если 31 строчку заменить на virtual void Set(){}; работает это все. Но нужно что бы функция оставалась чистой виртуальной функцией.
0
17.12.2018, 16:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2018, 16:01
Помогаю со студенческими работами здесь

Не получается создать экземпляр абстрактного класса
в общем я очень тупой, буду благодарен за умные советы, имеется класс object и наследуемые от него...

Ошибка: невозможно создать объект абстрактного класса
программа для заменны слова в файле, на введенное с клавы слово!реализовать нужно через интерфейс!...

Создать екземпляр из абстрактного класса
Привет всем, мне нужно в функции получить объект абстрактного класса, и создать новый объект этого...

Не могу создать дочку абстрактного класса
Следующий код на MS Visual C++ 2010 даёт ошибку error C2259: 'IntValue' : cannot instantiate...

Создать экземпляр класса без явного указания членов класса
Если у меня есть два конструктора, один из которых по умолчанию, а второй явный. Я почему-то не...

Не получается создать объект унаследованный от абстрактного класса
Здравствуйте! Нужна помощь с виртуальными функциями, в теории понимаю что это, а вот с...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru