Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
Всем привет у меня есть такая задача нужно сделать фабрику морзе, есть данный мейн и надо чтобы он заработал но столкнулся с проблемой что у меня невозможно создать экземпляр абстрактного класса, я все проверил и не понимаю почему класс абстрактный. Переопределил функции в дочернем классе, сижу над этим уже 2 дня, снизу код с++


Main
#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

#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

#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

#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

#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;
}
24 янв 21, 22:24    [22268506]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6419
NiKiTa228,

Комментарии на польском тоже сам писал?
24 янв 21, 22:31    [22268508]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
Siemargl, да, я учусь в польше, забыл их иззменить голова кипит с этим классом
24 янв 21, 22:33    [22268509]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
NiKiTa228,

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

morseFactory f;


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

morseFactory *f = new morse();

Если что, извините, особо не вчитывался. 30-ть секунд. :)
24 янв 21, 22:53    [22268515]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

NiKiTa228
я все проверил и не понимаю почему класс абстрактный. Переопределил функции в дочернем
классе, сижу над этим уже 2 дня, снизу код с++

Не хочу тебя огорчать, но компилятор явно перечисляет методы, из-за которых он считает
класс абстрактным, в тексте ошибки. Ты за два дня так и не догадался прочитать его вывод
дальше первой строки?..

Posted via ActualForum NNTP Server 1.5

24 янв 21, 22:54    [22268517]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
NiKiTa228,

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

void convert(const std::string& text) override;

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

Сообщение было отредактировано: 24 янв 21, 22:53
24 янв 21, 22:59    [22268525]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
Dimitry Sibiryakov, я читал из-за чего но я думал что смогу сделать на morseFactory а оно не пашет
24 янв 21, 23:06    [22268532]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
petrav, в main могу использовать только класс morseFactory
24 янв 21, 23:10    [22268534]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
NiKiTa228
petrav, в main могу использовать только класс morseFactory

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

Кстати, название "morseFactory" неудачное. Потому что фабрика — это другой паттерн.
Класс "morseFactory" нужно переименовать или в "MorseBase", или в "IMorse".
И стиль кодирования "morseFactory" применим только к переменным.
В названиях классов так не делают.
24 янв 21, 23:15    [22268536]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
petrav, ну это учитель дал задание на зачёт и не я придумывал названия
24 янв 21, 23:24    [22268540]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
NiKiTa228
petrav, ну это учитель дал задание на зачёт и не я придумывал названия

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

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

morseFactory *f = new morse();

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

virtual ~morseFactory() { };
24 янв 21, 23:32    [22268548]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
И удаление объекта:

morseFactory *f = new morse();
// Что-то делаем с f...
delete f;
f = NULL;
24 янв 21, 23:35    [22268555]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
petrav, даже если так то у меня выходит что morse получиться абстрактным
24 янв 21, 23:42    [22268560]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
petrav, а еще лучше сделать это как фабрику
24 янв 21, 23:46    [22268564]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
NiKiTa228
petrav, даже если так то у меня выходит что morse получиться абстрактным

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

Короче, методические материалы нужно перечитать.
24 янв 21, 23:47    [22268566]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6419
virtual void convert(const std::string& text) = 0;	

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

С ним нельзя создать класс, только дочерний, где он реализован
25 янв 21, 00:22    [22268580]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
petrav,а если создать класс creator то какому классу он будет дочерний и среализовать morseFactory *f = new creator;
25 янв 21, 00:52    [22268585]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
NiKiTa228
petrav,а если создать класс creator то какому классу он будет дочерний и среализовать morseFactory *f = new creator;

MorseCreator или MorseFactory. Это будет совершенно отдельный (третий) класс, не дочерний ни к чему. Его метод MorseFactory::create() будет возвращать указатель "MorseBase *" (то что сейчас называется morseFactory), а внутри будет написано "return new Morse()".
25 янв 21, 01:01    [22268588]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
NiKiTa228
Member

Откуда:
Сообщений: 9
petrav, понимаю, но как его реализовать а то у меня он не понимает что я хочу XD
25 янв 21, 01:13    [22268590]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

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

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

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

Ась? Ты думал, что сможешь обойти правила языка и заставить работать компилятор так, как
хочется тебе, а не его создателям? С таким самомнением надо сквозь стены проходить: "вижу
цель, не вижу препятствий".

Posted via ActualForum NNTP Server 1.5

25 янв 21, 01:33    [22268591]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
mayton
Member

Откуда: loopback
Сообщений: 51015
Зачем проверять большую и маленькую букву?

std::string morse::mors(char mor)
{
	switch (mor)
	{
	case '.':
		return "._._._";
	case 'a': case 'A':


Можно сразу вызвать tolower() и сократить число проверок в два раза.
25 янв 21, 02:18    [22268592]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

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

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

Совет сугубо эстетический. Вкусовщина, я считаю, что так нагляднее.
25 янв 21, 12:00    [22268743]     Ответить | Цитировать Сообщить модератору
 Re: Невозможно создать экземпляр абстрактного класса  [new]
petrav
Member

Откуда:
Сообщений: 2861
NiKiTa228
petrav, понимаю, но как его реализовать а то у меня он не понимает что я хочу XD

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

Фабрика это третий и последний компонент. С ним потом разберёмся.
25 янв 21, 12:02    [22268746]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить