Ho un problema di ordinamento del costruttore che sto cercando di trovare modi creativi per risolvere.Problema di costruzione costruttore (ambito globale)
Fondamentalmente ho una semplice classe Color
che memorizza le informazioni sul colore RGB e consente la manipolazione di detto colore e la conversione in altri spazi colore (24 bit, 16 bit, 4 bit, HSV, XYZ, LAB, ecc.). La classe stessa funziona perfettamente.
Ho anche una libreria di colori predefiniti, come ad esempio:
namespace Colors {
const Color Snow (255,250,250);
const Color GhostWhite (248,248,255);
const Color WhiteSmoke (245,245,245);
const Color Gainsboro (220,220,220);
const Color FloralWhite (255,250,240);
const Color OldLace (253,245,230);
const Color Linen (250,240,230);
const Color AntiqueWhite (250,235,215);
const Color PapayaWhip (255,239,213);
const Color BlanchedAlmond (255,235,205);
};
E tutti funzionano bene anche quando viene utilizzato in un programma normalmente.
Il mio problema si presenta quando provo ad usare quei colori di libreria nel costruttore su un altro oggetto. Non c'è niente da dire che il costruttore per il colore della libreria che uso sia stato eseguito e che i dati del colore siano assegnati (fa qualche piccola pre-elaborazione per calcolare alcuni dei diversi valori dello spazio colore) prima del costruttore per l'altra classe che riceve il Color
e lo assegna a una variabile di memoria all'interno di se stesso.
Ad esempio, la classe di colore ha un costruttore:
Color(const Color &c) {
setColor(c.getRed(), c.getGreen(), c.getBlue());
}
E un operatore =
:
Color &Color::operator=(const Color &rhs) {
setColor(rhs.getRed(), rhs.getGreen(), rhs.getBlue());
return *this;
}
setColor()
è solo una funzione di supporto poco che memorizza i valori e le pre-calcola un pò di colore spazio valori alternativi.
Quando includo uno nel costruttore di un altro oggetto, dire:
Color _storeColor;
TestClass(const Color &c) {
_storeColor = c;
}
o:
Color _storeColor;
TestClass(const Color &c) : _storeColor(c) {}
con:
TestClass myTest(Colors::WhiteSmoke);
i dati colore assegnate è (quasi sempre) tutto 0
come se il costruttore per la classe Color
non sia stato eseguito ancora, che ottengo totalmente.
Quindi sto cercando idee su come posso creare la mia libreria di colori predefiniti in modo tale che siano disponibili ad altri costruttori nell'ambito globale.
Per inciso, cose come:
TestClass myTest(Color(245,245,245));
funzionare perfettamente, anche se preferirei non avere centinaia (ed è) o centinaia #define
macro per la libreria di colori in quanto ciò causare un sacco di doppioni inutili oggetto e preferirei tenerlo come sempre facendo riferimento alle stesse istanze globali ogni volta che un colore viene riutilizzato.
Questo funziona bene, ma questo progetto è una libreria per gli altri a incorporare nel loro codice, e Non posso garantire il compilatore che useranno. La maggior parte di essi sarà basata su GCC, ma quale versione e cosa supporta è ipotizzata da chiunque. – Majenko
L'ABI C++ dipende dal compilatore. Se crei la tua libreria con gcc, sarà utilizzabile in modo affidabile solo dalla stessa versione di gcc. La garanzia ABI binario di gcc è generalmente, ma non sempre, compatibile solo con le versioni successive. E, in ogni caso, è improbabile che qualsiasi libreria C++ creata con gcc possa essere collegata con il codice creato da un altro compilatore. –
Mi fraintendimi. La "libreria" è distribuita come codice sorgente e compilata a croce dall'utente finale. Può essere compilato per un certo numero di diverse architetture utilizzando un numero di diversi ambienti di programmazione su un numero di diversi sistemi operativi. – Majenko