Ich versuche, ein Typsystem mit QSharedData
zu machen. Die Idee ist einfach, es wird eine Reihe verschiedener Datentypen geben, von denen jeder aus der Basis-abstrakten Klasse abgeleitet wird. Ich möchte QSharedData
verwenden, um die tatsächlichen Daten in jedem von ihnen zu speichern, aber jede der abgeleiteten Klassen wird verschiedene gespeicherte Daten haben. Ich versuche jetzt das grundlegendste Beispiel zu machen und einige Probleme zu haben.QSharedData und Vererbung
Sagen wir, das sind meine Basis rein virtuelle Klassen sind:
class cAbstractData: public QSharedData
{
public:
cAbstractData(){ }
virtual int type() = 0;
};
class cAbstractValue
{
public:
cAbstractValue(){ }
virtual int type() = 0;
protected:
QSharedDataPointer<cAbstractData>data_;
};
die wir nun sagen, dass ich einen einzigen Wert für die Darstellung (als minmalistic Beispiel, das ist) eine Klasse machen wollen. Ich Ableitung die cAtomicValue
von der Basiswertklasse, und ich bin auch eine Datenklasse Ableiten den Wert zu halten:
class cAtomicData:public cAbstractData
{
public:
cAtomicData() { value_ = 0; }
int type(){ return 1; }
QVariant value_;//the actual value
};
class cAtomicValue:public cAbstractValue
{
public:
cAtomicValue() {
data_ = new cAtomicData;//creating the data object.
}
int type(){ return 1; }
};
Jetzt in diesem Stadium es ganz gut, und im Debugger funktioniert, kann ich das Recht sehen Zeigertyp Aber jetzt möchte ich eine Funktion hinzufügen, um den Wert zu setzen und zu bekommen, und ich verstehe nicht, wie es geht. Nehmen wir den Setzer als Beispiel. Um den Wert einzustellen, müssen wir auf das value_
Mitglied der cAtomicData
Klasse über das data_
Mitglied der cAtomicValue
Klasse zugreifen. Da die data_
jedoch einen Basisklassenzeiger (cAbstractData
) enthält, muss ich ihn irgendwie auf den richtigen Typ (cAtomicData
) umwandeln. Ich habe versucht, dies zu tun:
template<class T> void set(T value)
{
static_cast<cAtomicData*>(data_.data())->value_ = value;
}
es offensichtlich nicht funktioniert, weil es detach()
genannt und versucht, eine Kopie der Basisklasse zu machen, die es nicht können, da die Basisklasse rein virtuell ist. Dann habe ich versucht, den Zeiger zu werfen selbst:
static_cast<cAtomicData*>(data_)->value_ = value;
aber ich bin immer einen invalid static_cast ...
Fehler.
Wie mache ich das, und mache ich es sogar grundsätzlich richtig?
Danke. Offensichtlich gibt es keinen Weg. Ich habe stattdessen 'QSharedPointer' verwendet. – SingerOfTheFall