Statyczne pole ID

0

Witam, chciałbym prosić o radę; jak sprawdzić by ID statyczne numerowało mi po kolej poszczególne obiekty. Posiadam static ID, którą przepisuję do ID_niestatyczne. Podczas uruchomienia, pierwszy obiekt ma randomową liczbę ID, kady kolejny liczony jest już normalny.

 class Klasa
{
    string imie;
    static int ID;
    int ID_niestatyczne;
public:
    Klasa()
    {
        imie = "Jan";

    }
    Klasa(string i)
    {
        this->imie = i;
        inkrementacjaID();
        this->ID_niestatyczne = ID;
    }
    void inkrementacjaID()
    {
        this->ID++;
    }
    void show();

};
int Klasa :: ID = 0;
void Klasa:: show()
{
    cout<<imie<<", ID: "<<ID_niestatyczne<<endl;
}


int main()
{

Klasa p1;
Klasa p2("Tomasz");
Klasa p3("Pawel");
p1.show();
p2.show();
p3.show();

return 0;
}
0

Z edytowałem to i działa, ale kod wydaję mi się nieelegancki, jest możliwość poprawek?

 ic:
    Klasa()
    {
        imie = "Jan";
        inkrementacjaID();


    }
    Klasa(string i)
    {
        this->imie = i;
        //inkrementacjaID();
        inkrementacjaID();


    }
    void inkrementacjaID()
    {
        ID_niestatyczne = ID;
        this->ID++;
    }
2
#include <iostream>
#include <string>
using namespace std;

class Klasa
  {
   string imie;
   static int ID;
   int ID_niestatyczne;
   public:
   Klasa(const string &imie="Jan"):imie(imie),ID_niestatyczne(++ID) {}
   Klasa(const Klasa &k):imie(k.imie),ID_niestatyczne(++ID) {}
   void show() { cout<<imie<<", ID: "<<ID_niestatyczne<<endl; }
  };
int Klasa::ID=0;

int main()
  {
   Klasa p1;
   Klasa p2("Tomasz");
   Klasa p3("Pawel");
   Klasa p4(p1);
   p1.show();
   p2.show();
   p3.show();
   p4.show();
   return 0;
  }

http://ideone.com/MdrEPp

2

Ew można całe liczenie wyciągnąć do osobnej klasy, która będzie liczyła id dla obiektów różnego typu:

template<typename T>
class counted_type {
	static size_t counter;
protected:
	counted_type(){}
	static size_t next_id() {
		return counter += 1;
	}
public:
	size_t id = next_id();
	
};
template<typename T>
size_t counted_type<T>::counter = 0;

Możemy sprawdzić to np. na "ludziach i owocach":

class person: public counted_type<person> {
	using counted_type<person>::id;

	string first_name, last_name;
public:

	person(string const &fname, string const &lname):
		first_name(fname), last_name(lname){}
		
	string to_string() const {
		return first_name + ", " + last_name + ", " + std::to_string(id);
	}
};

class fruit: public counted_type<fruit> {
	using counted_type<fruit>::id;
	
	string kind;
public:
	fruit(string const &kind): kind(kind){}

	string to_string() const {
		return kind + ", " + std::to_string(id);
	}
};

oraz następujących danych:

person people[] = {
	person("John", "Travolta"),
	person("Rocky", "Balboa"),
	person("Rick", "Grimes")
};

fruit fruits[] = {
	fruit("banana"),
	fruit("apple"),
	fruit("peach")
};

http://ideone.com/S2Yc8N

John, Travolta, 1
Rocky, Balboa, 2
Rick, Grimes, 3
banana, 1
apple, 2
peach, 3

Ewentualnie możemy całość za drobną zmianą przerobić na wersję nieinwazyjną:

template<typename T>
class type_counter {
	static size_t counter;
protected:
	static size_t next_id() {
		return counter += 1;
	}
public:
    type_counter(){}
	size_t id = next_id();
};
template<typename T>
size_t type_counter<T>::counter = 0;

wnet nasz person będzie wyglądał tak:

class person {
    const type_counter<person> counter;

	string first_name, last_name;
public:

	person(string const &fname, string const &lname):
		first_name(fname), last_name(lname){}
		
	string to_string() const {
		return first_name + ", " + last_name + ", " + std::to_string(counter.id);
	}
};

http://melpon.org/wandbox/permlink/3qBbQYYmxN81J3uz

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