powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Невозможно создать экземпляр абстрактного класса
23 сообщений из 23, страница 1 из 1
Невозможно создать экземпляр абстрактного класса
    #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
Невозможно создать экземпляр абстрактного класса
    #40038477
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiKiTa228,

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

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

Код: plaintext
1.
morseFactory f;



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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

Ась? Ты думал, что сможешь обойти правила языка и заставить работать компилятор так, как
хочется тебе, а не его создателям? С таким самомнением надо сквозь стены проходить: "вижу
цель, не вижу препятствий".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Невозможно создать экземпляр абстрактного класса
    #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
Невозможно создать экземпляр абстрактного класса
    #40038624
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

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

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


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