Czy możliwe jest nadanie każdemu z obiektów numeru seryjnego inaczej, niż wprowadzając ręcznie w parametrach funkcji?
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Czy możliwe jest nadanie każdemu z obiektów numeru seryjnego inaczej, niż wprowadzając ręcznie w parametrach funkcji?

AutorWiadomość
Temat założony przez niniejszego użytkownika
Czy możliwe jest nadanie każdemu z obiektów numeru seryjnego inaczej, niż wprowadzając ręcznie w parametrach funkcji?
» 2018-04-14 15:10:38
Hej, chodzi mi konkretnie o coś w stylu
obiekt 1 - numer 0001
obiekt 2 - numer 0002
...
obiekt n - numer n

Dopiero się uczę programowania obiektowego, może spróbować stworzyć jakąś bazę danych i z niej pobierać kolejne numery dla tworzonych obiektów?
P-170660
» 2018-04-14 15:23:44
Tak, da się. Przykład:
1. Utwórz w klasie zmienną statyczną i przypisz jej wartość, którą ma uzyskać pierwszy utworzony obiekt.
2. Utwórz w klasie zwykłe pole tego samego typu.
3. Napisz konstruktor, który przypisze do pola odpowiednią wartość i przestawi zmienną statyczną na kolejną dopuszczalną wartość dla następnego obiektu.
P-170661
» 2018-04-14 16:40:24
Naturalnym i unikalnym numerem seryjnym jest adres obiektu. Jeśli jednak chcesz mieć numery sekwencyjne lub teraz lub w przyszłości serializować dane i na podstawie numeru seryjnego je odtwarzać, lepiej jest zrobić zmienną statyczną.
Jeszcze innym pomysłem jest funkcja std::hash ale doczytaj jak i po co została stworzona.
P-170670
» 2018-04-15 09:58:20
Funkcje hashujace maja kolizje wiec odpada.
P-170681
» 2018-04-15 12:25:25
Jeśli obiektów może być naprawdę dużo, to warto skorzystać z liczby całkowitej (bez znaku) z największą dostępną liczbą bitów. Możesz to sobie zagwarantować, jeśli skorzystasz z
std::uintmax_t
, dołączając plik cinttypes.
Przykładowe użycie może wyglądać tak:
C/C++
#include <iostream>
#include <cinttypes>

class Foo
{
public:
    using HandleType = std::uintmax_t;
   
    Foo()
        : m_handle( nextUniqueHandle() )
    {
    }
   
    HandleType getHandle() const {
        return m_handle;
    }
private:
    HandleType m_handle;
    static HandleType nextUniqueHandle()
    {
        static HandleType currentHandle = 0;
        return currentHandle++;
    }
};

int main()
{
    for( int i = 0; i < 15; i++ )
    {
        Foo foo;
        std::cout << "foo.getHandle(): " << foo.getHandle() << std::endl;
    }
}
P-170684
« 1 »
 Strona 1 z 1