Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
ARTLINE-NN
1 / 1 / 1
Регистрация: 30.03.2012
Сообщений: 82
#1

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

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


http://www.cyberforum.ru/cpp-beginners/thread1422494.html
0
Вложения
Тип файла: rar Printers.rar (2.84 Мб, 17 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2012, 00:36
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка в классах (C++):

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

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

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

Ссылки в классах
Почему в этой программе нужно использовать ссылки? Как сделать эту программу не...

Наследование в классах
Уважаемые пожскажите по теме Есть класс Автомобиль (например ВАЗ 2114) и...

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

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

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

Добавлено через 7 минут
Очень нужно, помогите?(
0
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 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";
}
попробуй
1
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
23.05.2012, 01:34 #13
да там миллион проблем. в самом Matrix есть члены у которых имена такие же, как у чисто виртуальных функций. имена должны отличатся. чисто виртуальные функции должны бить реализованы. потом, эти функции возвращают неконстантные указатели на char, хотя сами функции константные. если мемберы переименовать и их возвращать в этих функциях, то будут ошибки компиляции. из константной функции возвращается неконстантный указатель на мембер. ну может так еще что-то есть. спать пора.

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

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

Перечисления в классах
Не могу понять почему в классах работают перечисления? Я не могу в классе...

String в классах
Доброго времени суток. Я создал класс, в котором есть несколько объектов типа...

функции в классах
есть класс my_class, у него есть две функцииmy_class::X_definition(int k, long...

программа в классах
помогите пожалуйста сделать программу в классах построить описание класса...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru