Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
1

Ошибка в классах

23.05.2012, 00:36. Показов 1600. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишет ошибку
error C2259: Matrix: невозможно создать экземпляр абстрактного класса

Что это значит?

выкладываю код в котором происходит ошибка:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "Printers.h"
#include <iostream>
#include <string.h>
#include "Matrix.h"
#include "Str.h"
#include "Laz.h"
using namespace std;
 
Printers::Printers(void)
{
int i, j;
Printers *p[3];
p[1] = new Matrix ("Seiko", "low", 40);
p[2] = new Str ("BJ-80", "medium", 60, "Termo");
p[3] = new Laz ("LaserJet", "high", 72, "Piezoelectric", "Suvenir");
for (int i = 0; j<3; i++)
p[i]->Print();
cout <<p[i]->marka();
cout <<p[i]->speed();
cout <<p[i]->quality();
cout <<p[i]->Smetod();
cout <<p[i]->tipmat();
}
Иерархия такая:

Принтеры (Базовый класс для каждого из подтипов):
>Матричный - Струйный – Лазерный.
>У Матричного будет марка(marka), скорость печати(speed), качество печати(quality).
>У Струйного добавляется: Способ распыления красителя(Smetod) - Термический(Termo)
>У Лазерного добавляется: По типу печатаемого материала(tipmat) - Рулонный(Rulon)
Вложения
Тип файла: rar Printers.rar (2.84 Мб, 18 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.05.2012, 00:36
Ответы с готовыми решениями:

Ошибка в классах
Подскажите что нужно сделать, что бы конструктор видел класс Cex(Цех) Перепишите текст программы и...

Ошибка в классах
Добрый день! Мне необходимо разбить 1 класс на 2: базовый и производный! Я вроде сделал, но...

Ошибка C2061 ( в классах)
Помогите, пожалуйста, исправить ошибку: в .cpp файле подключен Desk.h , но функция не хочет...

Enum в классах, выдается ошибка: Object required.
Описываю свойство Private mvarhKey As Enum 'local copy Если использовать этот класс в каком-то...

24
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:46 2
неплохо было бы еще сюда ошибки запостить с номерами строк. это если ошибки компиляции. если же у вас ошибка во время выполнения, то это из-за выхода за пределы массива. индексирование в массивах начинается с нуля, а не с еденици. поэтому запись p[3] - это обращение к четвертому элементу, а массив всего из трех.

error C2259: Matrix: невозможно создать экземпляр абстрактного класса
это из-за того, что не реализована одна из чисто виртуальных функций класса Matrix. проверте корректность сигнатур. возможно в производном классе просто забыли const к функциям добавить. ну или какую-то из функций просто не реализовали.
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.05.2012, 00:49 3
Цитата Сообщение от ARTLINE-NN Посмотреть сообщение
Matrix: невозможно создать экземпляр абстрактного класса
Это значит, что Matrix абстрактный класс, экземпляры таких классов создавать нельзя. Реализуйте все чисто виртуальные наследуемые методы в Matrix, и он не будет абстрактным.
1
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 01:00  [ТС] 4
Цитата Сообщение от DU Посмотреть сообщение
неплохо было бы еще сюда ошибки запостить с номерами строк. это если ошибки компиляции. если же у вас ошибка во время выполнения, то это из-за выхода за пределы массива. индексирование в массивах начинается с нуля, а не с еденици. поэтому запись p[3] - это обращение к четвертому элементу, а массив всего из трех.
Вы правы, не увидел этого)
хотя не в этом ошибка компиляции складывалась...

Цитата Сообщение от DU Посмотреть сообщение
error C2259: Matrix: невозможно создать экземпляр абстрактного класса
это из-за того, что не реализована одна из чисто виртуальных функций класса Matrix. проверте корректность сигнатур. возможно в производном классе просто забыли const к функциям добавить. ну или какую-то из функций просто не реализовали.
Вот сам class Matrix
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include "printers.h"
 
class Matrix : public Printers
{
public:
Matrix ();
Matrix (char*marka, char*quality, int speed);
Matrix (const Matrix & r);
~Matrix();
void Print () const;
protected:
char *marka;
int speed;
char*quality;
};
А вот cpp файл:
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 "printers.h"
#include "Matrix.h"
#include <iostream>
#include <string.h>
 
using namespace std;
Matrix :: Matrix () : quality ("low"), speed (40)
{
marka=new char [50];
strcpy (marka, "Epson");
}
Matrix :: Matrix (char*_marka, char*_quality, int _speed) : quality(_quality), speed(_speed)
{
marka = new char[strlen(_marka)+1];
strcpy (marka,_marka);
}
Matrix :: Matrix (const Matrix & r) : quality (r.quality), speed (r.speed)
{
marka = new char[strlen (r.marka) +1];
strcpy (marka, r.marka);
}
Matrix :: ~Matrix ()
{
delete[]marka;
}
void Matrix :: Print () const
{
cout << "Matrix printer" << endl;
cout << marka << endl;
cout << quality << endl;
cout << speed << endl;
}
Куда надо прописать виртуальную функцию?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.05.2012, 01:01 5
printers.h как выглядит?
upd: приложение не сразу заметил. У Printers 6 чисто виртуальных функций, а в Matrix реализована только одна (Print). реализуйте все остальные.
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 01:02 6
а вот базовый:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Printers
{
public:
    Printers::Printers(void);
    virtual ~Printers(){}
    virtual void Print() const=0;
    virtual char*marka() const=0;
    virtual char*quality() const=0;
    virtual int  speed() const=0;
    virtual char*Smetod() const=0;
    virtual char*tipmat() const=0;
};
 
реализована только функция Print. все остальные тоже нужно реализовать.
    virtual char*marka() const=0;
    virtual char*quality() const=0;
    virtual int  speed() const=0;
    virtual char*Smetod() const=0;
    virtual char*tipmat() const=0;
0
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 01:05  [ТС] 7
Цитата Сообщение от gray_fox Посмотреть сообщение
реализована только функция Print. все остальные тоже нужно реализовать.

Как их реализовать, обозначить?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.05.2012, 01:07 8
Цитата Сообщение от ARTLINE-NN Посмотреть сообщение
Как их реализовать, обозначить
Так же как и Print
1
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 01:09  [ТС] 9
Цитата Сообщение от gray_fox Посмотреть сообщение
printers.h как выглядит?
upd: приложение не сразу заметил. У Printers 6 чисто виртуальных функций, а в Matrix реализована только одна (Print). реализуйте все остальные.
А что делать если не все 6 функций в matrix используются?
а только 4?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.05.2012, 01:10 10
Быстрый вариант: написать в Matrix для них пустые тела (т.е. при вызове они ничего не будут делать).
1
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 01:26  [ТС] 11
Цитата Сообщение от gray_fox Посмотреть сообщение
Быстрый вариант: написать в Matrix для них пустые тела (т.е. при вызове они ничего не будут делать).
Я примерно понимаю что нужно делать, но у меня ошибок ещё больше выдаёт(
помоги с созданием класса matrix?

Добавлено через 7 минут
Очень нужно, помогите?(
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.05.2012, 01:34 12
Header:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <printers.h>
 
class Matrix : public Printers
{
public:
Matrix ();
Matrix (char*marka, char*quality, int speed);
Matrix (const Matrix & r);
~Matrix();
void Print () const;
 
   virtual char*marka() const      //=0;
   virtual char*quality() const;   //=0;
   virtual int  speed() const;     //=0;
   virtual char*Smetod() const;    //=0;
   virtual char*tipmat() const;    //=0;
 
protected:
char *marka_;    // _ добавил, иначе будет коллизия имён
int speed_;
char*quality_;
};
В .срр добавь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char * Matrix::marka() const {
    return  marka_;
}
 
char * Matrix::quality() const {
    return quality_;
}
 
int  Matrix::speed() const {
    return speed_;
}
 
char * Matrix::Smetod() const {
    return "no Smethod";   // вообще так нельзя, но ладно)
}
 
char * Matrix::tipmat() const {
    return "no tipmat";
}
попробуй
1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 01:34 13
да там миллион проблем. в самом Matrix есть члены у которых имена такие же, как у чисто виртуальных функций. имена должны отличатся. чисто виртуальные функции должны бить реализованы. потом, эти функции возвращают неконстантные указатели на char, хотя сами функции константные. если мемберы переименовать и их возвращать в этих функциях, то будут ошибки компиляции. из константной функции возвращается неконстантный указатель на мембер. ну может так еще что-то есть. спать пора.

вот кстати в посте выше. строка 2 из спп файла не скомпилится. тут нужно константные чары возвращать. ну или если по быстрому, сделать marka_ mutable переменной.
1
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 02:02  [ТС] 14
А что в int main прописать в printers.cpp??

Добавлено через 4 минуты
gray_fox, Большое спасибо! всё пошло...:dance3:
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.05.2012, 02:03 15
Цитата Сообщение от ARTLINE-NN Посмотреть сообщение
А что в int main прописать в printers.cpp??
непонял, что там main делает. Вот так по крайней мере скомпилируется, но вообще лучше так не писать:
http://liveworkspace.org/code/... 2ef2ee0502
1
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 02:07  [ТС] 16
в файле printers.cpp вот такое можно сделать:

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
#include <iostream>
#include <string.h>
#include "printers.h"
#include "Matrix.h"
#include "Str.h"
#include "Laz.h"
using namespace std;
 
int main()
{
 
Matrix mx ("Seiko", "low", 40);
mx.Print ();
Str sr ("BJ-80", "medium", 60, "Termo");
sr.Print ();
Matrix *p = &sr;
p->Print();
Laz lz ("LaserJet", "high", 72, "Piezoelectric", "Suvenir");
lz.Print ();
Str*pp= &lz;
pp->Print();
return 0;
 
}
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.05.2012, 02:13 17
Ладно, проехали)
0
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 02:16  [ТС] 18
Что написать в мейне чтобы выводились на экран эти записи?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.05.2012, 02:18 19
Какие "эти" записи?
0
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 02:20  [ТС] 20
ну название принтеров...

"Seiko", "low", 40
"BJ-80", "medium", 60, "Termo"
"LaserJet", "high", 72, "Piezoelectric", "Suvenir"
0
23.05.2012, 02:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2012, 02:20
Помогаю со студенческими работами здесь

Определить какие из имён встречаются во всех классах, только в некоторых классах, не встречаются ни в одном
1. Заданный имена девочек . Определить , какие из этих имён встречаются во всех классах данной...

Вызов методов в классах, ошибка: variable type 'Sequin' is an abstract class
Мне выдает следующую ошибкуerror: variable type 'Sequin' is an abstract class. Я предполагаю, что...

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих...

Заданы имена девочек. Определить, какие встречаются во всех классах, которые есть только в некоторых классах и какие не встречаются
Заданы имена девочек. Определить, какие из этих имен встречаются во всех классах данной параллели,...

какие из этих имен встречаются во всех классах данной параллели которые есть только в некоторых классах и какие из этих имен не встречаются ни в одном
Помогите написать программу: заданы имена девочек определить какие из этих имен встречаются во всех...

Нумерация в классах
Всем доброго времени суток. Не совсем уверен, что правильно назвал тему, но не суть :) В общем, у...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru