Niedostępny odpowiedni konstruktor domyślny

0

Witam, od niedawna zacząłem pisać programy obiektowo i niektóre zagadnienia nadal sprawiają mi trudność. Po kilku pierwszych działających programach zabrałem się za stworzenie edytora do GUI, zacząłem od stworzenia klas dla guzików. Wszystko szło dobrze, aż doszedłem do okrągłego przycisku. Program ma jakiś problem z dziedziczoną klasą. Treść errora: " 'GuiElement': niedostępny odpowiedni konstruktor domyślny". W teorii brzmi prosto, mimo to nie rozumiem o co mu chodzi. Niżej link do pliku nagłówkowego oraz źródłowego:
gui.h : https://pastebin.com/ghNFCa4e
gui.cpp : https://pastebin.com/EmZWZzdK (Błąd w wierszu 61)

Mógłbym prosić o pomoc? Rozwiązanie jest pewnie banalne, a ja już męczę się z tym drugi dzień. W pewnym momencie nawet zrezygnowałem z dziedziczenia i przekopiowałem metody. Wolałbym jednak zrobić to ładniej i czytelniej. Z góry dziękuje za pomoc.

4

Kiedy definiujesz "customowy" konstruktor, kompilator nie definiuje wtedy niejawnie domyślnego. Możesz napisać własny albo zmusić kompilator, żeby go wygenerował: GuiElement() = default;

0

Dziękuję za odpowiedź. Nie rozumiem tylko jednej rzeczy. Chciałem, żeby klasa CircularButton odziedziczyła wszystkie potrzebne metody i zmienne, ale nie używała konstruktora klasy GuiElement (tamten jest dostosowany do guzików prostokątnych). Nigdzie w tej klasie nie wspomniałem mu konstruktorze tamtej klasy. Czemu w ogóle o niej wspomina i wymaga go? Nie może całkowicie zignorować istnienia konstruktora klasy dziedziczonej?

2

Konstruktor klasy pochodnej zawsze używa konstruktora klasy bazowej. Jeśli na liście inicjalizacyjnej nie wywołasz jakiegoś, zostanie wywołany konstruktor domyślny klasy bazowej. Nie ma możliwości żeby temu zapobiec.

0

Dziękuję bardzo za odpowiedź. W takim razie najlogiczniej będzie zrobić kilka konstruktorów w klasie bazowej dla prostokątnych i okrągłych obiektów (jedne używają metody SFML .setSize(float, float), drugie setRadius(float)). Jeszcze raz dziękuję.

1

Możesz też w klasie pochodnej napisać:

using GUIElement::GUIElement;

Dzięki temu klasa pochodna odziedziczy konstruktory klasy bazowej.
Więcej info tu i tu

1
Euvarios napisał(a):

W takim razie najlogiczniej będzie zrobić kilka konstruktorów w klasie bazowej dla prostokątnych i okrągłych obiektów (jedne używają metody SFML .setSize(float, float), drugie setRadius(float)).

Dlaczego klasa bazowa ma wiedzieć, jakie klasy pochodne będą po niej dziedziczyć? Jak kiedyś dodasz trójkątny i gwieździsty przyciski to też zrobisz nowe konstruktory dla klasy bazowej? Przemyśl jeszcze raz hierarchię dziedziczenia i interfejsy poszczególnych klas.

1 użytkowników online, w tym zalogowanych: 0, gości: 1