Może błędnie zdiagnozowałem, ale główny kod, w którym ten problem występuje wykazuje takie objawy jak opisałem.
Kodu nie mam zamiaru umieszczać, bo jest bardzo duży, ale pokrótce opiszę, dlaczego myślę, że to jest przyczyną problemu.
Ogólnie, wykorzystuję szablon do łatwego tworzenia takich pseudoklas.
Mam bazowy szablon Class, który dziedziczy po ClassPriv (który służy za interface).
Mniej więcej coś takiego. Jest to tymczasowe rozwiązanie, które robiłem na szybko i będę to jeszcze optymalizował.
template < const char * className >
class Class
: public ClassPriv
{
static Class < className > nullDef;
}
template < const char * className >
Class < className > Class < className >::nullDef = Class < className >;
Klasa wygenerowana przez szablon ma przechowywać definicje klasy.
Na podstawie definicji mogę tworzyć obiekty klas ClassVar.
Każdy taki obiekt może być utworzony dynamiczne globalnie lub w jakimś bloku funkcji lub jako definicja argumentu funkcji (mając na myśli skrypt , który czytam i na jego podstawie tworzę model kodu).
Jeśli tworzę obiekt globalnie lub w bloku funkcji lub jako argument funkcji, to niejawne instancje szablonów znajdują się w jednym pliku żródłowym, np. main.cpp.
Mogę jednak zdefiniować funkcje wbudowane (definiowane przez ze mnie i tylko w razie potrzeby), których argumentami mogą być te wygenerowane klasy ClassVar.
Każda taka funkcja ma swój własny .cpp, który zawiera też implementację funkcji inicjalizacyjnej, w której tworzę definicję wariantów tej funkcji i tam też znajdują się niejawne instancje szablonów.
Teraz przyjmijmy, że zdefiniowałem funkcję exec, która ma 5 wariantów i w sumie wszystkie warianty mają po 3 definicje tej samej klasy ClassVar<1>.
int init() {
ClassVar < 1 >* classVar = nullptr;
append( classVar = new ClassVar < 1 > );
qDebug() << getStatic();
append( classVar = new ClassVar < 1 > );
qDebug() << getStatic();
append( classVar = new ClassVar < 1 > );
qDebug() << getStatic();
}
Wtedy przy inicjalizacji sprawdzam adres zmiennej statycznej dla wszystkich definicji. Adresy wyjdą np. 0x23, 0x23, 0x23
Ale dla innej funkcji np.exec2, która znajduje się już w innym .cpp otrzymam np. 0x54, 0x54, 0x54
A tam gdzie tworzę obiekt globalnie lub w bloku funkcji lub jako argument funkcji też mam ten sam adres dla całego .cpp (.o) dla konkretnego szablonu, ale inny niż powyższe.
Wiem już też, jak to ominę, a ten kod czeka optymalizacja, jednak w aktualnym stanie bardzo dobrze spełnia swoje zadanie, tylko wynikowy program jest duży.
Dlatego też stworzyłem też ten temat, bo dopiero zacząłem z szablonami i uznałem, że robię coś źle i potrzebowałem poznać wasze zdanie.
Często się zdarza, że odpowiedź jest na tyle oczywista, że nawet w internecie nie ma na to odpowiedzi :P