QSharedData
을 사용하는 동안 타입 시스템을 만들려고합니다. 아이디어는 간단합니다. 여러 가지 데이터 유형이 있습니다. 각 유형은 기본 추상 클래스에서 파생됩니다. QSharedData
을 사용하여 각각의 실제 데이터를 저장하려고하지만 파생 클래스 각각에 다른 데이터가 저장 될 것입니다. 나는 지금 가장 기본적인 예제를 만들고, 몇 가지 문제를 겪고있다. QSharedData and 継承
class cAbstractData: public QSharedData
{
public:
cAbstractData(){ }
virtual int type() = 0;
};
class cAbstractValue
{
public:
cAbstractValue(){ }
virtual int type() = 0;
protected:
QSharedDataPointer<cAbstractData>data_;
};
이제 내가 (인 minmalistic 예와 같은) 하나의 값을 표현하기위한 클래스를 만들고 싶어 가정 해 봅시다. 나는 기본 값 클래스에서 cAtomicValue
를 유도하고있어, 나는 또한 값을 유지하기 위해 데이터 클래스를 파생하고 있습니다 : 그것은 잘 작동이 단계에서 이제
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; }
};
을하고, 디버거에서 나는 권리를 볼 수 있습니다 포인터 유형. 하지만 이제는 값을 설정하고 가져 오는 함수를 추가하려고합니다. 어떻게해야하는지 이해하지 못합니다. 세터를 예로 들어 봅시다. 값을 설정하려면 cAtomicValue
클래스의 data_
멤버를 통해 cAtomicData
클래스의 구성원 인 value_
에 액세스해야합니다. 그러나 data_
이 기본 클래스 포인터 (cAbstractData
)를 보유하고 있기 때문에 어떻게 든 올바른 유형 (cAtomicData
)으로 캐스팅해야합니다. 나는이 일을 시도 :
template<class T> void set(T value)
{
static_cast<cAtomicData*>(data_.data())->value_ = value;
}
가 분명히 작동하지 않습니다, 그것은 detach()
라고하고 기본 클래스는 가상 순수 할 수 없기 때문에 기본 클래스의 사본을 시도하기 때문이다. 그런 다음 포인터 자체를 캐스팅하려고 :
static_cast<cAtomicData*>(data_)->value_ = value;
을하지만, 나는 invalid static_cast ...
오류를 받고 있어요.
어떻게하면됩니까? 근본적으로 올바른 방법으로 수행하고 있습니까?
감사합니다. 분명히 실제로 방법이 없습니다. 결국'QSharedPointer'를 대신 사용했습니다. – SingerOfTheFall