Witam,
Wam klasę Connect:
class Connect final :protected Connectdata
{
//zmienne statyczne
static int unique_connect;
static int total_connect;
public:
//konstruktor z wartościami domyślnymi
Connect(int begin_value = 0) : Connectdata(begin_value)
{
number_connect = unique_connect++;
total_connect++;
};
// konstruktor z wartościami ustawianymi
Connect(int output, int entrace, int weight) : Connectdata(output, entrace, weight)
{
number_connect = unique_connect++;
total_connect++;
};
// konstruktor kopiujący
Connect(const Connect &connect) :Connectdata(connect)
{
number_connect = unique_connect++;
total_connect++;
};
//destruktor
~Connect()
{
total_connect--;
};
//interfejs
// funkcje zaprzyjaźnione
};
Problem jakiego nie mogę rozwiązać, dotyczy eleganckiej inicjalizacji zmiennych statycznych podczas startu programu.
Mam kilka klas i każda ma po kilka zmiennych statycznych i zapis:
int Vertex::unique_vertex = 1;
int Vertex::total_vertex = 1;
int Connect::unique_connect = 1;
int Connect::total_connect = 1;
int main()
{
// ..... program
}
jest cholernie niewygodny i nieelegancki.
Chciałem to zrobić za pomocą metody statycznej
static void initialize()
{
unique_connect = 1;
total_connect = 1;
}
również nie chce działać.
Funkcje zaprzyjaźnione również nie dają oczekiwanego rezultatu
friend void initialize();
//........
void initialize()
{
int Connect::total_connect = 1;
}
Kombinowanie ze słowem kluczowym extern również wywołuje błędy kompilacji.
Na pewno jest na to jakiś banalny i elegancki sposób, bo nie uśmiecha mi się przed funkcją main znacjonalizować kilkanaście zmiennych.
Pozdrawiam
EDIT:
Kiedyś miałem problem z odtwarzaniem dźwięku w aplikacji, to
@Adanos poradził pokombinować z warunkiem if i typem bool. Zastosowałem to samo tutaj, tylko że, w ciele konstruktora, ale też nie działa.
EDIT2:
Chyba jednak będę musiał zrezygnować ze zmiennych statycznych i zastąpić je "normalnymi". Dzięki temu będę mógł użyć tego triku z konstruktorem.
EDIT3:
Nope. Jednak nie zadziała. Zmienna bool musiałaby być statyczna, czyli... musiałbym ją zainicjować
private:
int unique_connect;
int total_connect;
bool flag = true;
Connect(int begin_value = 0) : Connectdata(begin_value)
{
if (flag)
{
unique_connect = 1;
total_connect = 1;
flag = false;
}
number_connect = unique_connect++;
total_connect++;
};
Chociaż plus, jest taki, że mogę zainicjować wszystkie zmienne startowe wszystkich klas w jednej funkcji, którą mogę wywołać przy starcie aplikacji..
EDIT 4:
Jednak to musi być rozwiązanie na zmiennych statycznych.
Jeśli ktoś ma pomysł jak to zrobić to chętnie poczytam.