Próbuję zliczać ilość instancji klasy "testowa", które zostaną stworzone podczas działania programu, ale kompilator wywala mi błędy, których nie rozumiem. Do zliczania instancji postanowiłem użyć statycznego atrybutu klasy, który (tak sobie wymyśliłem) będę inkrementował podczas każdego wywołania konstruktora oraz dekrementował podczas każdego wywołania destruktora. Niestety nie działa to tak, jak bym chciał. Gdzie popełniam błąd?
Oto kawałek kodu, na którym dziś się uczę:
Kod: Zaznacz cały
#include <iostream>
class Testowa
{
private:
int val;
/* Ma naliczać instancje klasy Testowa */
static int cnt;
public:
Testowa()
{
cnt++;
}
Testowa(int v) : val{ v }
{
cnt++;
}
~Testowa()
{
cnt--;
}
int GetVal() const
{
return val;
}
void SetVal(int v)
{
val = v;
}
int GetCnt() const
{
return cnt;
}
};
int main()
{
Testowa tst;
tst.SetVal(389);
std::cout << tst.GetVal() << std::endl;
std::cout << tst.GetCnt() << std::endl;
system("pause");/* unsafe */
return EXIT_SUCCESS;
}
Oraz treść obu błędów:
Error LNK2001 unresolved external symbol "private: static int Testowa::cnt" (?cnt@Testowa@@0HA)
Error LNK1120 1 unresolved externals
EDIT:
No dobra, chyba już rozumiem treść błędów. W związku z tym, że atrybuty statyczne przechowywane są w sekcji zmiennych globalnych i nie jest wymagana instancja klasy, atrybut ten traktowany jest jako zewnętrzny, choć może być o dostępie prywatnym lub publicznym. Wciąż nie rozumiem, dlaczego konstruktor, destruktor oraz metoda Testowa::getCnt() const nie może pracować na atrybucie static int cnt, ale poradziłem sobie w inny sposób. Rozdzieliłem kod na pliki interfejsu i implementacji oraz użyłem zmiennej poza klasą. Tak to wygląda:
main.cpp
Kod: Zaznacz cały
#include <iostream>
#include "Testowa.h"
int main()
{
Testowa tst[30];
tst[13].SetVal(389);
std::cout << tst[13].GetVal() << std::endl;
std::cout << tst[18].GetVal() << std::endl;
std::cout << tst[0].GetCnt() << std::endl;
std::cout << tst[29].GetCnt() << std::endl;
system("pause");/* unsafe */
return EXIT_SUCCESS;
}
Testowa.cpp
Kod: Zaznacz cały
#include "Testowa.h"
static int cnt;
Testowa::Testowa() : val{0}
{
++cnt;
}
Testowa::Testowa(int v) : val{ v }
{
++cnt;
}
Testowa::~Testowa()
{
--cnt;
}
int Testowa::GetVal() const
{
return val;
}
void Testowa::SetVal(int v)
{
val = v;
}
int Testowa::GetCnt() const
{
return cnt;
}
Testowa.h
Kod: Zaznacz cały
#pragma once
class Testowa
{
private:
int val;
public:
Testowa();
Testowa(int v);
~Testowa();
int GetVal() const;
void SetVal(int v);
int GetCnt() const;
};
Programik działa zgodnie z moimi oczekiwaniami:
Chętnie przyjmę podpowiedź, czy da się jakoś zawrzeć w klasie statyczny atrybut, który naliczałby ilość instancji klasy, bo mam wrażenie, że moja metoda jest chałupnicza.