klasa-element statyczny i konstruktor

0

Mam taki plik nagłówkowy i próbuję stworzyć konstruktor dla klasy który będzie zliczał ilość utworzenia obiektu LiczbaZespolona. Kompilator cały czas wyrzuca błąd : undefined reference to `LiczbaZespolona::a' nie wiem jak to ugryźć bo wydaje mi się że jest ok.

#include <iostream>


using namespace std;

class LiczbaZespolona
{
  
        static int a;
	public:
            
	
	  float  re;
	  float  im;

	  LiczbaZespolona operator * (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator + (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator * (int Arg2);
	  LiczbaZespolona &operator= (int  liczba);
	  LiczbaZespolona operator - (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator / (const LiczbaZespolona& Arg2);
          
          LiczbaZespolona()
          {
              a++;//undefined reference to `LiczbaZespolona::a'
          }
};

std::ostream & operator << ( std::ostream & StrmWy, LiczbaZespolona Lz );
std::istream & operator >> ( std::istream & StrmWe, LiczbaZespolona & Lz ); 
0

A definicję tej zmiennej statycznej masz? Gdzieś w pliku źródłowym musi być int LiczbaZespolona a = 0;. a to bardzo kiepska nazwa dla zmiennej. (Podobnie jak pisanie klasy do liczb zespolonych, od tego jest std::complex) Poza tym takie coś normalnie działa:

#include <iostream>
 
class X {
public:
  static unsigned int counter;
  
  X() {
    ++counter;      
  }
};
 
unsigned int X::counter = 0;
 
int main() {
  X x;
  std::cout << x.counter;
  
  return 0;
}

http://ideone.com/5GvGW5

0

Klasa została napisana bo takie są wymagania do zadania :D
Jak poprawiłem kod i teraz wyrzuca mi : multiple definition of `LiczbaZespolona::counter'
Chyba coś robię źle.

#include <iostream>


using namespace std;
/*!
 *\brief definicja klasy dla liczb zespolonych.
 *przechowuje wertosc liczby rzeczywistej i urojonej oraz
 *przeladowania dla tego typu.
 */
class LiczbaZespolona
{
  
	public:
             static unsigned int counter;
	/*!
	 *\brief przechowuje wartosc rzeczywista
	 */
	  float  re;
	  /*!
	   *\brief przechowuje wartosc urojona
	   */
	  float  im;
	  /*!
	   *\brief przeladowania operatorow arytmetycznych dla roznych typow
	   */
	  LiczbaZespolona operator * (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator + (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator * (int Arg2);
	  LiczbaZespolona &operator= (int  liczba);
	  LiczbaZespolona operator - (const LiczbaZespolona& Arg2);
	  LiczbaZespolona operator / (const LiczbaZespolona& Arg2);
          LiczbaZespolona() {
    ++counter;      
  }
         
};
unsigned int LiczbaZespolona::counter = 0;
/*!
 *\brief przeladowanie strumienia wejscia oraz wyjscia dla LiczbaZespolona
 */
std::ostream & operator << ( std::ostream & StrmWy, LiczbaZespolona Lz );
std::istream & operator >> ( std::istream & StrmWe, LiczbaZespolona & Lz );
 
0

wiersz:
unsigned int LiczbaZespolona::counter = 0;
musi być w .cpp a nie w .h

0

Jestem z siebie dumny poradziłem sobie z tym :D
Endrju dziękuję za wskazówki.

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