Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / Невозможно создать экземпляр абстрактного класса / 23 сообщений из 23, страница 1 из 1
24.01.2021, 22:24
    #40038475
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
Всем привет у меня есть такая задача нужно сделать фабрику морзе, есть данный мейн и надо чтобы он заработал но столкнулся с проблемой что у меня невозможно создать экземпляр абстрактного класса, я все проверил и не понимаю почему класс абстрактный. Переопределил функции в дочернем классе, сижу над этим уже 2 дня, снизу код с++


Main
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#include<iostream>
#include "morseFactory.h"  //includujemy jedn&#261; swoj&#261; klas&#281; 

int main(){
morseFactory f;  // Невозможно создать экземпляр абстрактного класса

f.setExternalInfo("200 200 400");
f.setOutput(morseFactory::BEEP);
f.convert("Ala ma kota");

return 0;
}



Класс morseFactory

Код: plaintext
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.
#ifndef morseFactory_H
#define morseFactory_H
#pragma once

#include<iostream>


class morseFactory
{
public:
    morseFactory();
    morseFactory(const morseFactory&) = delete;
    ~morseFactory() { };

    morseFactory* obj;

    enum klas { BEEP, BLINK, DISK, CONSOLE };                       //enumenator

    virtual void setExternalInfo(const std::string& ustaw);			// parser
    void setOutput(klas mo);							            // wybieranie metody wyjscia danych
    
    virtual void convert(const std::string& text) = 0;			    // konwertacja textu w morsa
    virtual void convert(int lint) = 0;				                // konwertacja liczb typu int w morsa
    virtual void convert(double ldou) = 0;	                        // konwertacja liczb typu double w morsa
    
    std::string Info();
    
    std::string ustaw;


};

#endif




Клас morseFactory cpp

Код: plaintext
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.
#include "morseFactory.h"
#include"beep.h"

morseFactory::morseFactory()
{
	ustaw = "";
	obj = nullptr;
}

void morseFactory::setExternalInfo(const std::string& ustaw)
{
}

void morseFactory::setOutput(klas mo)
{

	if (obj!=nullptr)
	{
		obj = nullptr;
	}
	switch (mo) {
	case BEEP:
		obj = new beep;
		obj->setExternalInfo(ustaw);
		break;
	default:
		obj = nullptr;
		std::cout << "ERROR";
	}
}
/*
void morseFactory::convert(const std::string& text)
{
}


void morseFactory::convert(int lint)
{
}

void morseFactory::convert(double ldou)
{
}
*/

std::string morseFactory::Info()
{
	return this->ustaw;
}



Клас morse

Код: plaintext
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.
#ifndef MORSE_H
#define MORSE_H

#include <iostream>
#include <string>
#include "morseFactory.h"

class morse : public morseFactory
{
protected:

	//konstrukory

	morse();														//konstruktor bezparametrowy
	morse(morse& copy) = delete;									//konstruktor kopiuj&#261;cy niemozliwy bo mamy tylko jeden objekt
	~morse();														//destruktor

	morse& operator=(const morse& morse) = delete;					//operator= niemozliwy bo mamy tylko jeden objekt

	std::string dane;

public:
	//metody
	virtual void tlumaczenie(const std::string& dane)=0;
	std::string mors(char mor);										//przetwarza char'a na morse

	void convert(const std::string& text) override;			        // konwertacja textu w morsa
	virtual void convert(double ldou);
	virtual void convert(int lint);

	void setExternalInfo(const std::string& ustaw);					// konwertacja liczb typu int w morsa

	std::string getExtendInfo();

};

#endif



Клас morse cpp

Код: plaintext
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.
#include "morse.h"

morse::morse()
{
	dane = "";
}

morse::~morse()
{
}

std::string morse::mors(char mor)
{
	switch (mor)
	{
	case '.':
		return "._._._";
	case 'a': case 'A':
		return "._";
	case 'b': case 'B':
		return "_...";
	case 'c': case 'C':
		return "_._.";
	case 'd': case 'D':
		return "_..";
	case 'e': case 'E':
		return ".";
	case 'f': case'F':
		return ".._.";
	case 'g': case'G':
		return"__.";
	case 'h': case'H':
		return"....";
	case 'i': case'I':
		return"..";
	case 'j': case'J':
		return".___";
	case 'k': case'K':
		return"_._";
	case 'l': case'L':
		return"._..";
	case 'm': case'M':
		return"__";
	case 'n': case'N':
		return"_.";
	case 'o': case'O':
		return"___";
	case 'p': case'P':
		return".__.";
	case 'q': case'Q':
		return"__._";
	case 'r': case'R':
		return"._.";
	case 's': case'S':
		return"...";
	case 't': case'T':
		return"_";
	case 'u': case'U':
		return".._";
	case 'v': case'V':
		return"..._";
	case 'w': case'W':
		return".__";
	case 'x': case'X':
		return"_.._";
	case 'y': case'Y':
		return"_.__";
	case 'z': case'Z':
		return"__..";
	case ' ':
		return"?";
	case '1':
		return".____";
	case '2':
		return"..___";
	case '3':
		return"...__";
	case '4':
		return"...._";
	case '5':
		return".....";
	case '6':
		return"_....";
	case '7':
		return"__...";
	case '8':
		return"___..";
	case '9':
		return"____.";
	case '0':
		return"_____";
	default:
		return"";
	}
}

void morse::convert(const std::string& text)
{
	tlumaczenie(text);
}

void morse::convert(int lint)
{
	std::string morse;
	morse = std::to_string((lint));  //funkcja kopiuj&#261;ca warto&#347;&#263; long do string
	tlumaczenie(morse);				 //wywo&#322;anie metody dla konkretnego obiektu
}

void morse::setExternalInfo(const std::string& ustaw)
{
	dane = ustaw;
}

void morse::convert(double ldou)
{
	std::cout << " ";
}

std::string morse::getExtendInfo()
{
	return this->dane;
}
...
Рейтинг: 0 / 0
24.01.2021, 22:31
    #40038477
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228,

Комментарии на польском тоже сам писал?
...
Рейтинг: 0 / 0
24.01.2021, 22:33
    #40038478
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
Siemargl, да, я учусь в польше, забыл их иззменить голова кипит с этим классом
...
Рейтинг: 0 / 0
24.01.2021, 22:53
    #40038483
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228,

У вас базовый абстрактный класс "morseFactory". В классе наследнике "morse" вы, я надеюсь, переопределили чистые виртуальные функции. Но вы пытаетесь создать экземпляр базового абстрактного класса:

Код: plaintext
1.
morseFactory f;



Вам нужно написать так:

Код: plaintext
1.
morseFactory *f = new morse();


Если что, извините, особо не вчитывался. 30-ть секунд. :)
...
Рейтинг: 0 / 0
24.01.2021, 22:54
    #40038484
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228я все проверил и не понимаю почему класс абстрактный. Переопределил функции в дочернем
классе, сижу над этим уже 2 дня, снизу код с++

Не хочу тебя огорчать, но компилятор явно перечисляет методы, из-за которых он считает
класс абстрактным, в тексте ошибки. Ты за два дня так и не догадался прочитать его вывод
дальше первой строки?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.01.2021, 22:59
    #40038485
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228,

И я не уверен что это откомпилируется:

Код: plaintext
1.
void convert(const std::string& text) override;


Если метод виртуальный то в классе наследнике я советую писать и virtual, и override одновременно. Так нагляднее.
...
Рейтинг: 0 / 0
24.01.2021, 23:06
    #40038486
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
Dimitry Sibiryakov, я читал из-за чего но я думал что смогу сделать на morseFactory а оно не пашет
...
Рейтинг: 0 / 0
24.01.2021, 23:10
    #40038487
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
petrav, в main могу использовать только класс morseFactory
...
Рейтинг: 0 / 0
24.01.2021, 23:15
    #40038488
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228
petrav, в main могу использовать только класс morseFactory

Почему же? Значит вы недопоняли идею абстрактных классов/интерфейсов.

Кстати, название "morseFactory" неудачное. Потому что фабрика — это другой паттерн.
Класс "morseFactory" нужно переименовать или в "MorseBase", или в "IMorse".
И стиль кодирования "morseFactory" применим только к переменным.
В названиях классов так не делают.
...
Рейтинг: 0 / 0
24.01.2021, 23:24
    #40038492
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
petrav, ну это учитель дал задание на зачёт и не я придумывал названия
...
Рейтинг: 0 / 0
24.01.2021, 23:32
    #40038494
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228
petrav, ну это учитель дал задание на зачёт и не я придумывал названия

Ну так себе преподаватель, хотя это понятно, от практики он далёк.

Короче, основная идея абстрактных интерфейсов состоит в чём? В том что мы описываем абстрактный класс.
И через указатель (или ссылку) на базовый абстрактный класс единообразным способом оперируем различными
реализациями данной абстрактной идеи (интерфейса, класса). Но создавать мы должны конкретную реализацию
этой абстрактной идеи. Понимаете? Есть идея и есть множество реализаций этой идеи. Поэтому только так:

Код: plaintext
1.
morseFactory *f = new morse();


И да деструктор базового класса, в данном случае, тоже должен быть виртуальным:

Код: plaintext
1.
virtual ~morseFactory() { };
...
Рейтинг: 0 / 0
24.01.2021, 23:35
    #40038495
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
И удаление объекта:

Код: plaintext
1.
2.
3.
4.
morseFactory *f = new morse();
// Что-то делаем с f...
delete f;
f = NULL;
...
Рейтинг: 0 / 0
24.01.2021, 23:42
    #40038497
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
petrav, даже если так то у меня выходит что morse получиться абстрактным
...
Рейтинг: 0 / 0
24.01.2021, 23:46
    #40038498
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
petrav, а еще лучше сделать это как фабрику
...
Рейтинг: 0 / 0
24.01.2021, 23:47
    #40038499
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228
petrav, даже если так то у меня выходит что morse получиться абстрактным

Нет. morseFactory — абстрактная идея. А morse реализация этой идеи. Вы можете создать morse2 (африканский стандарт:). И оперировать классами morse и morse2 через указатель на morseFactory не зная какая на самом деле реализация идеи скрывается за указателем на morseFactory.

Короче, методические материалы нужно перечитать.
...
Рейтинг: 0 / 0
25.01.2021, 00:22
    #40038513
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
Код: plaintext
1.
virtual void convert(const std::string& text) = 0;	


Абстрактный метод.

С ним нельзя создать класс, только дочерний, где он реализован
...
Рейтинг: 0 / 0
25.01.2021, 00:52
    #40038518
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
petrav,а если создать класс creator то какому классу он будет дочерний и среализовать morseFactory *f = new creator;
...
Рейтинг: 0 / 0
25.01.2021, 01:01
    #40038521
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228
petrav,а если создать класс creator то какому классу он будет дочерний и среализовать morseFactory *f = new creator;

MorseCreator или MorseFactory. Это будет совершенно отдельный (третий) класс, не дочерний ни к чему. Его метод MorseFactory::create() будет возвращать указатель "MorseBase *" (то что сейчас называется morseFactory), а внутри будет написано "return new Morse()".
...
Рейтинг: 0 / 0
25.01.2021, 01:13
    #40038523
NiKiTa228
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
petrav, понимаю, но как его реализовать а то у меня он не понимает что я хочу XD
...
Рейтинг: 0 / 0
25.01.2021, 01:33
    #40038524
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
petravЕсли метод виртуальный то в классе наследнике я советую писать и virtual, и override
одновременно. Так нагляднее.

Второе уже подразумевает первое. Вредный совет.

NiKiTa228я читал из-за чего но я думал что смогу сделать на morseFactory а оно не пашет

Ась? Ты думал, что сможешь обойти правила языка и заставить работать компилятор так, как
хочется тебе, а не его создателям? С таким самомнением надо сквозь стены проходить: "вижу
цель, не вижу препятствий".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.01.2021, 02:18
    #40038525
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
Зачем проверять большую и маленькую букву?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
std::string morse::mors(char mor)
{
	switch (mor)
	{
	case '.':
		return "._._._";
	case 'a': case 'A':



Можно сразу вызвать tolower() и сократить число проверок в два раза.
...
Рейтинг: 0 / 0
25.01.2021, 12:00
    #40038624
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
Dimitry Sibiryakov

petravЕсли метод виртуальный то в классе наследнике я советую писать и virtual, и override
одновременно. Так нагляднее.

Второе уже подразумевает первое. Вредный совет.
Совет сугубо эстетический. Вкусовщина, я считаю, что так нагляднее.
...
Рейтинг: 0 / 0
25.01.2021, 12:02
    #40038625
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Невозможно создать экземпляр абстрактного класса
NiKiTa228
petrav, понимаю, но как его реализовать а то у меня он не понимает что я хочу XD

Сначала разберитесь с чистыми виртуальными функциями. И переименуйте базовый класс.

Фабрика это третий и последний компонент. С ним потом разберёмся.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Невозможно создать экземпляр абстрактного класса / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]