Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/100: Рейтинг темы: голосов - 100, средняя оценка - 4.99
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31

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

14.01.2012, 15:51. Показов 19793. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
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; #include &lt;windows.h&gt; #include...

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

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

20
 Аватар для cyberobot
15 / 15 / 8
Регистрация: 01.09.2011
Сообщений: 65
14.01.2012, 16:00
может в производном классе должны быть определены копии всех виртуальных функций?
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:04  [ТС]
Нет. тоже самое.=)
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
14.01.2012, 16:08
Ну вопервых
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  [ТС]
Цитата Сообщение от 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
 Аватар для Mayonez
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
14.01.2012, 16:14
Цитата Сообщение от Akkoks Посмотреть сообщение
она есть уже, но все равно не катит
я и так делаю все по новой уже 3 раз
ПЕРЕОПРЕДЕЛИТЕ функции базового класса в классе-наследнике
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:18  [ТС]
Цитата Сообщение от 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
 Аватар для Mayonez
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
14.01.2012, 16:21
Цитата Сообщение от Akkoks Посмотреть сообщение
вот, пожалуйста =) все равно не работает=)
а их реализация?

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

Добавлено через 38 секунд
и по-моему они не должны быть виртуальными...
Реализация не обязательнА, пока я ими не буду пользоваться...
Да, по моему тоже, но разве тогда они не буду считаться, как "свои" функции производного класса?
0
43 / 40 / 2
Регистрация: 21.09.2009
Сообщений: 145
14.01.2012, 16:26
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  [ТС]
Цитата Сообщение от 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
Листинг ошибок скиньте сюды
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 16:38  [ТС]
Цитата Сообщение от fridi Посмотреть сообщение
Листинг ошибок скиньте сюды
ну в вашем примере возникла куча ошибок из-за того, что многие функции должны возвращать значение
а без пустых реализаций только одна ошибка

Ошибка 1 error C2259: String: невозможно создать экземпляр абстрактного класса c:\локальный диск\универ\c++\kursach3\kursach3\main.c pp 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  [ТС]
Цитата Сообщение от 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
вот подправил вроде все ок должно быть
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
Чисто виртуальная ф-я, которая не определена в производном классе(String), остается чисто виртуальной, поэтому такой класс, как и базовый(Object), является абстрактным.
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 17:30  [ТС]
Цитата Сообщение от 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

Будут считаться) Как раз смысл чистых виртуальных в том и заключается, чтобы их переопределяли как нормальные.
0
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31
14.01.2012, 18:39  [ТС]
В общем нашел в чем трабл...
Все методы, где передается параметр String надо либо удалить, либо параметр поменять на object.
что из этого верно я пока не определил
fridi большое спасибо
0
1 / 1 / 0
Регистрация: 20.05.2016
Сообщений: 47
17.12.2018, 16:01
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2018, 16:01
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru