konstruktor zagnieżdżonej klasy

0

Witam. Próbuję napisać konstruktor zagnieżdżonej klasy. Dlaczego konstruktor wyrzuca błąd ? Chciałbym uzyskać taki efekt, żeby w podpowiedziach kodu poza klasą CharacterInfoPanel nie były widoczne te zagnieżdżone klasy.

class CharacterInfoPanel : public Panel {

	class CharacterInfoMenuButton {
		
		CharacterInfoMenuButton();
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Statistics : private CharacterInfoMenuButton {

		Statistics() : CharacterInfoMenuButton() { /*error*/ }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Layout : private CharacterInfoMenuButton {

		Layout() : CharacterInfoMenuButton() { /*error*/ }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Dialogues : private CharacterInfoMenuButton {

		Dialogues() : CharacterInfoMenuButton() { /*error*/ }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Quests : private CharacterInfoMenuButton {

		Quests() : CharacterInfoMenuButton() { /*error*/ }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};
0

Zrobiłem coś takiego i się kompiluje, ale czy to jest poprawny kod ?

class CharacterInfoPanel : public Panel {

	class CharacterInfoMenuButton {
	public:
		CharacterInfoMenuButton();
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Statistics : protected CharacterInfoMenuButton {

		Statistics() : CharacterInfoMenuButton() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Layout : protected CharacterInfoMenuButton {

		Layout() : CharacterInfoMenuButton() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Dialogues : protected CharacterInfoMenuButton {

		Dialogues() : CharacterInfoMenuButton() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Quests : protected CharacterInfoMenuButton {

		Quests() : CharacterInfoMenuButton() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};
};
0

Przecież masz prywatne konstruktury, wszędzie używasz class bez public.

Dziediczenie po czymś innym niż public to sztuka dla sztuki i tak się generalnie nie robi. Poczytaj o composition over inheritance

0

Poczytałem. Wiem jak robić klasy dziedziczące bez zagnieżdżenia. Po prostu chciałem uzyskać takie klasy do których spoza klasy CharacterInfoPanel nie ma się dostępu

0

@tBane: a nie wystarczyło użyć namespace ? Nagle zajdzie potrzeba większej widoczności klas i znowu COPY/PASTE ?

0

@Marius.Maximus otóż jest to kod wywoływany tylko raz. Dlatego ponawiam pytanie.

0

A jakie jest pytanie ?

Umieszczanie klasy w klasie dla mnie jest jak najbardziej poprawne .

W klasach które dziedziczą po CharacterInfoMenuButton możesz użyć
using CharacterInfoMenuButton::CharacterInfoMenuButton
ale to raczej cukier skladniowy

0

Dobra. Już znalazłem rozwiązanie. Wszędzie należy użyć public i wtedy działa i podpowiedzi są takie jak trzeba.

class CharacterInfoPanel : public Panel {
public:
	class CharacterInfoPage {
	public:
		CharacterInfoPage() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Statistics : public CharacterInfoPage {
	public:
		Statistics() : CharacterInfoPage() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Layout : public CharacterInfoPage {
	public:
		Layout() : CharacterInfoPage() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Dialogues : public CharacterInfoPage {
	public:
		Dialogues() : CharacterInfoPage() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

	class Quests : public CharacterInfoPage {
	public:
		Quests() : CharacterInfoPage() { }
		void handleEvent(sf::Event& event) { }
		void update() { }
		void draw() { }
	};

public:
	std::vector < CharacterInfoPage* > pages;


	CharacterInfoPanel() : Panel() {

		pages.push_back(new Statistics());
		pages.push_back(new Layout());
		pages.push_back(new Dialogues());
		pages.push_back(new Quests());

	}

	~CharacterInfoPanel() { }
	void handleEvent(sf::Event& event) { }
	void update() { }
	void draw() { }

};

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.