Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / C++ |
![]() ![]() |
NiKiTa228 Member Откуда: Сообщений: 9 |
Всем привет у меня есть такая задача нужно сделать фабрику морзе, есть данный мейн и надо чтобы он заработал но столкнулся с проблемой что у меня невозможно создать экземпляр абстрактного класса, я все проверил и не понимаю почему класс абстрактный. Переопределил функции в дочернем классе, сижу над этим уже 2 дня, снизу код с++ Main #include<iostream> #include "morseFactory.h" //includujemy jedną swoją klasę 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ą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ąca wartość long do string tlumaczenie(morse); //wywoł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] Ответить | Цитировать Сообщить модератору |
Siemargl Member Откуда: 010100 Сообщений: 6419 |
NiKiTa228, Комментарии на польском тоже сам писал? |
24 янв 21, 22:31 [22268508] Ответить | Цитировать Сообщить модератору |
NiKiTa228 Member Откуда: Сообщений: 9 |
Siemargl, да, я учусь в польше, забыл их иззменить голова кипит с этим классом |
24 янв 21, 22:33 [22268509] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
NiKiTa228, У вас базовый абстрактный класс "morseFactory". В классе наследнике "morse" вы, я надеюсь, переопределили чистые виртуальные функции. Но вы пытаетесь создать экземпляр базового абстрактного класса: morseFactory f; Вам нужно написать так:
morseFactory *f = new morse();
Если что, извините, особо не вчитывался. 30-ть секунд. :) |
24 янв 21, 22:53 [22268515] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52913 |
Не хочу тебя огорчать, но компилятор явно перечисляет методы, из-за которых он считает класс абстрактным, в тексте ошибки. Ты за два дня так и не догадался прочитать его вывод дальше первой строки?.. Posted via ActualForum NNTP Server 1.5 |
||
24 янв 21, 22:54 [22268517] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
NiKiTa228, И я не уверен что это откомпилируется: void convert(const std::string& text) override; Если метод виртуальный то в классе наследнике я советую писать и virtual, и override одновременно. Так нагляднее. Сообщение было отредактировано: 24 янв 21, 22:53 |
24 янв 21, 22:59 [22268525] Ответить | Цитировать Сообщить модератору |
NiKiTa228 Member Откуда: Сообщений: 9 |
Dimitry Sibiryakov, я читал из-за чего но я думал что смогу сделать на morseFactory а оно не пашет |
24 янв 21, 23:06 [22268532] Ответить | Цитировать Сообщить модератору |
NiKiTa228 Member Откуда: Сообщений: 9 |
petrav, в main могу использовать только класс morseFactory |
24 янв 21, 23:10 [22268534] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Почему же? Значит вы недопоняли идею абстрактных классов/интерфейсов. Кстати, название "morseFactory" неудачное. Потому что фабрика — это другой паттерн. Класс "morseFactory" нужно переименовать или в "MorseBase", или в "IMorse". И стиль кодирования "morseFactory" применим только к переменным. В названиях классов так не делают. |
||||
24 янв 21, 23:15 [22268536] Ответить | Цитировать Сообщить модератору |
NiKiTa228 Member Откуда: Сообщений: 9 |
petrav, ну это учитель дал задание на зачёт и не я придумывал названия |
24 янв 21, 23:24 [22268540] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Ну так себе преподаватель, хотя это понятно, от практики он далёк. Короче, основная идея абстрактных интерфейсов состоит в чём? В том что мы описываем абстрактный класс. И через указатель (или ссылку) на базовый абстрактный класс единообразным способом оперируем различными реализациями данной абстрактной идеи (интерфейса, класса). Но создавать мы должны конкретную реализацию этой абстрактной идеи. Понимаете? Есть идея и есть множество реализаций этой идеи. Поэтому только так:
morseFactory *f = new morse();
И да деструктор базового класса, в данном случае, тоже должен быть виртуальным:
virtual ~morseFactory() { };
|
||||
24 янв 21, 23:32 [22268548] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
И удаление объекта:morseFactory *f = new morse(); // Что-то делаем с f... delete f; f = NULL; |
24 янв 21, 23:35 [22268555] Ответить | Цитировать Сообщить модератору |
NiKiTa228 Member Откуда: Сообщений: 9 |
petrav, даже если так то у меня выходит что morse получиться абстрактным |
24 янв 21, 23:42 [22268560] Ответить | Цитировать Сообщить модератору |
NiKiTa228 Member Откуда: Сообщений: 9 |
petrav, а еще лучше сделать это как фабрику |
24 янв 21, 23:46 [22268564] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Нет. morseFactory — абстрактная идея. А morse реализация этой идеи. Вы можете создать morse2 (африканский стандарт:). И оперировать классами morse и morse2 через указатель на morseFactory не зная какая на самом деле реализация идеи скрывается за указателем на morseFactory. Короче, методические материалы нужно перечитать. |
||||
24 янв 21, 23:47 [22268566] Ответить | Цитировать Сообщить модератору |
Siemargl Member Откуда: 010100 Сообщений: 6419 |
virtual void convert(const std::string& text) = 0; Абстрактный метод. С ним нельзя создать класс, только дочерний, где он реализован |
25 янв 21, 00:22 [22268580] Ответить | Цитировать Сообщить модератору |
NiKiTa228 Member Откуда: Сообщений: 9 |
petrav,а если создать класс creator то какому классу он будет дочерний и среализовать morseFactory *f = new creator; |
25 янв 21, 00:52 [22268585] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
MorseCreator или MorseFactory. Это будет совершенно отдельный (третий) класс, не дочерний ни к чему. Его метод MorseFactory::create() будет возвращать указатель "MorseBase *" (то что сейчас называется morseFactory), а внутри будет написано "return new Morse()". |
||||
25 янв 21, 01:01 [22268588] Ответить | Цитировать Сообщить модератору |
NiKiTa228 Member Откуда: Сообщений: 9 |
petrav, понимаю, но как его реализовать а то у меня он не понимает что я хочу XD |
25 янв 21, 01:13 [22268590] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52913 |
Второе уже подразумевает первое. Вредный совет.
Ась? Ты думал, что сможешь обойти правила языка и заставить работать компилятор так, как хочется тебе, а не его создателям? С таким самомнением надо сквозь стены проходить: "вижу цель, не вижу препятствий". Posted via ActualForum NNTP Server 1.5 |
||||
25 янв 21, 01:33 [22268591] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 51015 |
Зачем проверять большую и маленькую букву?std::string morse::mors(char mor) { switch (mor) { case '.': return "._._._"; case 'a': case 'A': Можно сразу вызвать tolower() и сократить число проверок в два раза. |
25 янв 21, 02:18 [22268592] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Совет сугубо эстетический. Вкусовщина, я считаю, что так нагляднее. |
||||||
25 янв 21, 12:00 [22268743] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2861 |
Сначала разберитесь с чистыми виртуальными функциями. И переименуйте базовый класс. Фабрика это третий и последний компонент. С ним потом разберёмся. |
||||
25 янв 21, 12:02 [22268746] Ответить | Цитировать Сообщить модератору |
Все форумы / C++ | ![]() |