Zliczanie instancji klasy.

W tym miejscu zadajemy pytania na temat języka C++, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Zliczanie instancji klasy.

Postautor: Antystatyczny » niedziela 20 sie 2017, 12:08

Witam.

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:

Zrzut ekranu 2017-08-20 13.07.51.png


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.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: Zliczanie instancji klasy.

Postautor: dambo » niedziela 20 sie 2017, 14:01

taki przykład znalazłem - może coś podpowie:
https://pl.wikibooks.org/wiki/C%2B%2B/S ... _statyczne

i tutaj:
http://cpp0x.pl/kursy/Programowanie-obi ... klasie/489

generalnie ten motyw z liczeniem instancji klasy jest kluczowym przykładem dla tego. I dość ważnym - np ilość pocisków na planszy, przeciwników itp w przypadku gier.
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Zliczanie instancji klasy.

Postautor: Antystatyczny » niedziela 20 sie 2017, 19:28

Ja to akurat potrzebuję do zliczania elementów listy, ale cały pomysł jest wciąż w powijakach, bo wyłożyłem się na podstawowej sprawie, czyli zliczaniu instancji.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

kijas1
Posty: 10
Rejestracja: sobota 02 sty 2016, 18:50

Re: Zliczanie instancji klasy.

Postautor: kijas1 » niedziela 20 sie 2017, 20:48

Nie znajduje symbolu bo dla zmiennej statycznej w klasie trzeba stworzyć poza klasą jeszcze definicje gdzieś w pliku c. Wpisz gdzieś w pliku c. int Testowa::cnt=0 . Powinno być wszystko ok.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Zliczanie instancji klasy.

Postautor: Antystatyczny » niedziela 20 sie 2017, 20:55

Ok, działa. W pliku interfejsu mam static int cnt;, a w pliku implementacji int Testowa:cnt; Wszystko się kompiluje i działa.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.


Wróć do „Pisanie programów w C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości