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

Невозможно создать экземпляр абстрактного класса. :) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Строки C/C++ http://www.cyberforum.ru/cpp-beginners/thread428057.html
До строк пока что не дошёл, взгляните если не сложно: Задана строка, содержащая целые числа (максимум 20 чисел). Упорядочить числа в строке по возрастанию. У самого есть предположение, но насколько оно правильное - это другое дело.
C++ побитовая запись в файл можно ли записать отдельный бит в файл? http://www.cyberforum.ru/cpp-beginners/thread428051.html
Изобразить ромб C++
Задано целое число. Используя средства стандартного ввода-вывода, изобразить на экране ромб, меньшая диагональ которого равна заданному числу и параллельна оси Ох, а большая в 2 раза длиннее меньшей. со сторонами всё понятно.а вот как изобразить не знаю...
попробовала написать программу C++
#include <iostream> using namespace std; int main() { int I, A, x, y =0; cout << "input x = , I= , A= ";
C++ win api точки входа http://www.cyberforum.ru/cpp-beginners/thread428035.html
меня интересуют названия функция получения точки входа файла получения конца файла (feof не подойдёт) и функция изменения точки входа. всё это запущенное приложение должно применить к другому exe файлу(задание на win api ) собственно подскажите пожалуйста название функция
C++ Помогите с заданием http://s1.ipicture.ru/uploads/20120114/BWTr3yZw.jpg Типа надо прединкремент заменить на постинкремент? подробнее

Показать сообщение отдельно
Akkoks
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 31

Невозможно создать экземпляр абстрактного класса. :) - C++

14.01.2012, 15:51. Просмотров 5400. Ответов 18
Метки (Все метки)

Делаю курсовик, сейчас на начальной стадии (а как же еще к концу сессии ). Код, который я сейчас покажу еще "сырой", а точнее нарезка из лаб за семестр и и тп. Пока отлаживаю просто создание объекта и пытаюсь запихать его в контейнер(шаблонный класс, который сам же и написал "список"). Объект суть производный класс из абстрактного. В мэйне при инициализации объекта возникает ошибка от компилятора "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;
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru