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

Ошибка в классах - C++

Восстановить пароль Регистрация
 
 
ARTLINE-NN
 Аватар для ARTLINE-NN
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 00:36     Ошибка в классах #1
Пишет ошибку
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 Мб, 17 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2012, 00:36     Ошибка в классах
Посмотрите здесь:

C++ Ошибка в классах
C++ наследование в классах
C++ Видимость в классах
наследование в классах C++
Ссылки в классах C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 00:46     Ошибка в классах #2
неплохо было бы еще сюда ошибки запостить с номерами строк. это если ошибки компиляции. если же у вас ошибка во время выполнения, то это из-за выхода за пределы массива. индексирование в массивах начинается с нуля, а не с еденици. поэтому запись p[3] - это обращение к четвертому элементу, а массив всего из трех.

error C2259: Matrix: невозможно создать экземпляр абстрактного класса
это из-за того, что не реализована одна из чисто виртуальных функций класса Matrix. проверте корректность сигнатур. возможно в производном классе просто забыли const к функциям добавить. ну или какую-то из функций просто не реализовали.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.05.2012, 00:49     Ошибка в классах #3
Цитата Сообщение от ARTLINE-NN Посмотреть сообщение
Matrix: невозможно создать экземпляр абстрактного класса
Это значит, что Matrix абстрактный класс, экземпляры таких классов создавать нельзя. Реализуйте все чисто виртуальные наследуемые методы в Matrix, и он не будет абстрактным.
ARTLINE-NN
 Аватар для ARTLINE-NN
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;
}
Куда надо прописать виртуальную функцию?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.05.2012, 01:01     Ошибка в классах #5
printers.h как выглядит?
upd: приложение не сразу заметил. У Printers 6 чисто виртуальных функций, а в Matrix реализована только одна (Print). реализуйте все остальные.
DU
1477 / 1053 / 45
Регистрация: 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;
ARTLINE-NN
 Аватар для ARTLINE-NN
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 01:05  [ТС]     Ошибка в классах #7
Цитата Сообщение от gray_fox Посмотреть сообщение
реализована только функция Print. все остальные тоже нужно реализовать.

Как их реализовать, обозначить?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.05.2012, 01:07     Ошибка в классах #8
Цитата Сообщение от ARTLINE-NN Посмотреть сообщение
Как их реализовать, обозначить
Так же как и Print
ARTLINE-NN
 Аватар для ARTLINE-NN
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?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.05.2012, 01:10     Ошибка в классах #10
Быстрый вариант: написать в Matrix для них пустые тела (т.е. при вызове они ничего не будут делать).
ARTLINE-NN
 Аватар для ARTLINE-NN
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 01:26  [ТС]     Ошибка в классах #11
Цитата Сообщение от gray_fox Посмотреть сообщение
Быстрый вариант: написать в Matrix для них пустые тела (т.е. при вызове они ничего не будут делать).
Я примерно понимаю что нужно делать, но у меня ошибок ещё больше выдаёт(
помоги с созданием класса matrix?

Добавлено через 7 минут
Очень нужно, помогите?(
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
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";
}
попробуй
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 01:34     Ошибка в классах #13
да там миллион проблем. в самом Matrix есть члены у которых имена такие же, как у чисто виртуальных функций. имена должны отличатся. чисто виртуальные функции должны бить реализованы. потом, эти функции возвращают неконстантные указатели на char, хотя сами функции константные. если мемберы переименовать и их возвращать в этих функциях, то будут ошибки компиляции. из константной функции возвращается неконстантный указатель на мембер. ну может так еще что-то есть. спать пора.

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

Добавлено через 4 минуты
gray_fox, Большое спасибо! всё пошло...:dance3:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.05.2012, 02:03     Ошибка в классах #15
Цитата Сообщение от ARTLINE-NN Посмотреть сообщение
А что в int main прописать в printers.cpp??
непонял, что там main делает. Вот так по крайней мере скомпилируется, но вообще лучше так не писать:
http://liveworkspace.org/code/9f7559...1ebf2ef2ee0502
ARTLINE-NN
 Аватар для ARTLINE-NN
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;
 
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.05.2012, 02:13     Ошибка в классах #17
Ладно, проехали)
ARTLINE-NN
 Аватар для ARTLINE-NN
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
23.05.2012, 02:16  [ТС]     Ошибка в классах #18
Что написать в мейне чтобы выводились на экран эти записи?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.05.2012, 02:18     Ошибка в классах #19
Какие "эти" записи?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 02:20     Ошибка в классах
Еще ссылки по теме:

C++ функции в классах
C++ Ошибка C2061 ( в классах)
C++ Ошибка в классах

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

Или воспользуйтесь поиском по форуму:
ARTLINE-NN
 Аватар для ARTLINE-NN
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"
Yandex
Объявления
23.05.2012, 02:20     Ошибка в классах
Ответ Создать тему
Опции темы

Текущее время: 04:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru