gpt4 book ai didi

c++ - QSharedData 和继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:13 28 4
gpt4 key购买 nike

我正在尝试使用 QSharedData 创建一个类型系统。这个想法很简单,会有许多不同的数据类型,每一种都将派生自基本抽象类。我想使用 QSharedData 将实际数据存储在它们中的每一个中,但是每个派生类将在其中存储不同的数据。我现在正在尝试制作最基本的示例,但遇到了一些麻烦。

假设这些是我的基础纯虚拟类:

class cAbstractData: public QSharedData
{
public:
cAbstractData(){ }
virtual int type() = 0;
};

class cAbstractValue
{
public:
cAbstractValue(){ }
virtual int type() = 0;
protected:
QSharedDataPointer<cAbstractData>data_;
};

现在假设我想创建一个类来表示单个值(作为一个简单的示例)。我从基值类中派生了 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; }
};

现在在这个阶段它工作得很好,在调试器中我可以看到正确的指针类型。但是现在我想添加一个设置和获取值的功能,但我不明白该怎么做。我们以setter为例。要设置值,我们必须通过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 ... 错误。

我该怎么做,我什至从根本上是正确的吗?

最佳答案

您可以切换到 QExplicitlySharedDataPointer 而不是 QSharedDataPointer .那样detach()每当您尝试获取指向 cAbstractData 的非常量指针时都不会被调用对象,其中包括转换 QExplicitlySharedDataPointer<cAbstractData>反对 QExplicitlySharedDataPointer<cAtomicData>目的。但是,您需要调用 detach()每次要对 cAbstractData 进行修改时手动如果您要使用写时复制。也许您可以编写一个包装类来为您执行分离。

此方法可能优于使用 QSharedPointer , 因为 QExplicitlySharedDataPointer与普通指针大小相同(因此保持二进制兼容性),而 QSharedPointer是两倍大小(参见 this blog entry )。

编辑:请注意来自 QExplicitlySharedDataPointer<cAbstractData> 的类型转换至 QExplicitlySharedDataPointer<cAtomicData>是静态的,因此您必须保证实际引用的对象是 cAtomicData 类型的对象(或子类的),或者使用指针时的行为可能未定义。

关于c++ - QSharedData 和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12579091/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com