Inicjalizacja atrybutu klasy przed wywołaniem konstruktora klasy bazowej.

0

Witam.
Mam problem otóż stworzyłem:
-klasę bazową Tower, w której konstruktorze tworzę Polygon w koło niej, czyli zasięg na jaki będzie atakować inne obiekty
-oraz trzy klasy pochodne RedTower, GreenTower, BlueTower i chcę aby każdy z tych towerów miał inny zasięg(czyli rozmiar tego polygonu, który jest tworzony w konstruktorze klasy bazowej)

Jeśli w klasie bazowej stworzę atrybut: int range i w klasie pochodnej w konstruktorze nadam mu wartość. Np. dla RedTower, range = 100 to najpierw wywoła się konstruktor klasy bazowej i będzie chciał utworzyć Polygon rozmiaru range, który to zostanie zainicjalizowany dopiero później.

W jaki sposób można to rozwiązać?

1

Niech Tower będzie klasą abstrakcyjną która ma Range=0 w tym przypadku poligon jest zerowy.
Do tego metoda setRange(unsigned Range) - którą będziesz wywoływać w konstruktorach innych wierz.
Z tym że o ile nie jest konieczna wymuszona masturbacja z dziedziczeniem to zrób jedynie atrybut który nadaje klasie:
Nazwę i Range

0

Spraw by konstruktor klasy bazowej przyjmował jako parametr range, skoro potrzebuje tego do poprawnego wykonania się.
Trochę to śmierdzi, rozumiem, że konstruktor klasy bazowej będzie protected i tyko klasy pochodne bdą mogły tworzyć obiekty.

0

Tylko, że wtedy najpierw wywoła się konstruktor klasy bazowej i utworzy Polygon o zasięgu 0. Po nim dopiero wywoła się konstruktor pochodnej i w nim metoda setRange(), która już nic mi nie da. Bym musiał tworzyć ten polygon w konstruktorze klasy pochodnej.

Na pewno nie ma innego wyjścia, niż przyjmowanie range w konstruktorze? Wtedy przy tworzeniu obiektu np. RedTower będę musiał podawać mu range, a nie będzie on stały ustalony dla niego.

EDIT:

Już chyba rozwiązanie problem. Stworzyłem metodę void create_polygon() w klasie bazowej i wywołuję ją dopiero w klasie pochodnej po zainicjalizowaniu wartości range.

0

Jeżeli dobrze zrozumiałem, to czemu nie tak:

#include <iostream>
using namespace std;

class Tower {
protected:
	Tower(int range) {
		cout << range << endl;
	}
};

class RedTower : public Tower {
	static const int RedRange = 100; //integral type, legal
public:
	RedTower() : Tower(RedRange) {

	}
};

int main(int argc, char const *argv[]) {
	RedTower red;
	return 0;
}
0

Tak to rzeczywiście ma sens. Mógłbyś mi tylko powiedzieć dlaczego użyłeś static const?

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