Statyczne pole ID

Odpowiedz Nowy wątek
2016-04-14 22:49
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;
}

/We learn not for school but for our life/

Pozdrawiam

Pozostało 580 znaków

2016-04-14 23:08

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++;
    }

/We learn not for school but for our life/

Pozdrawiam

Pozostało 580 znaków

2016-04-15 21:17
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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2016-04-15 21:42
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

edytowany 1x, ostatnio: spartanPAGE, 2016-04-15 21:48

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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