gpt4 book ai didi

c++ - 从类名转换

转载 作者:行者123 更新时间:2023-11-28 02:42:06 26 4
gpt4 key购买 nike

如何从类名中转换指针 thisthis 是一个指向对象的指针,它继承了 QObject

我尝试了 metaObject->cast(this) 但如何从类名中获取 QMetaObject?

编辑我有一个类 Node

class Node : public QObject
{
Q_OBJECT
public:
Node(QObject* p = NULL):QObject(p){}
virtual void runImplementation() = 0;
void run()
{
//initialize all input properties
...
runImplementation();
}
void setInputValue(QMap<QString, QVariant> inputsValue) { _inputsValue = inputsValue;}
private:
QMap<QString, QVariant> _inputsValue;
};

NodeA

class NodeA : public Node 
{
Q_OBJECT
Q_PROPERTY(int _a READ a WRITE setA)
public:
NodeA(QObject* p = NULL): Node (p){}
void runImplementation() {//do specific operation}
int a() const { return _a;}
void setA(int a) { _a = a;}
private:
int _a;
};

和一个类NodeB

class NodeB : public NodeA
{
Q_OBJECT
Q_PROPERTY(double _a READ a WRITE setA)
public:
NodeB(QObject* p = NULL):NodeA(p){}
void runImplementation() {//do specific operation}
double a() const { return _a;}
void setA(double a) { _a = a;}
private:
double _a;
};

run 方法中,我想用映射中包含的值初始化所有输入属性。

NodeB nodeB;
QMap<QString, QVariant> inputB;
QVariant varDouble;
varDouble.setValue(5.4);
inputB.insert(QString("_a"), varDouble);
QVariant varInt;
varInt.setValue(3);
inputB.insert(QString("NodeA:_a"), varInt);
nodeB.setInputValue(inputB);
nodeB.run();

所以在 run 方法中,我在 map 上进行迭代,

  • 我想将指针 this 转换为我对象的真实类型(节点 B)。这是我的第一个问题。有了这个,我可以访问属性 double _a。目前,我使用 QVariant v = this->metaObject()->cast(this)->property(...); 这样做好吗?
  • 并且我想将指针this 转换为类型(NodeA)。这是我的第二个问题。有了这个,我可以访问属性 int
    _a
    .

最佳答案

您可以使用 static_cast<NodeA*>(this)dynamic_cast<NodeA*>(this) ,但您绝不能那样做。因为基类永远不会知道它实际上是派生类的一个实例。而是使用您的虚拟方法 runImplementation初始化从 Node 继承的类.

好的初始化看起来像这样:

NodeB b;
b.load(map);

class NodeB
{
virtual void load(QVariantMap map) override
{
loadMyself(map);
NodeA::load(map); // or even better: NodeA::load(map["base"].toMap());
}
}

class NodeA
{
virtual void load(QVariantMap map) override
{
loadMyself(map);
Node::load(map); // or even better: Node::load(map["base"].toMap());
}
}

class Node
{
virtual void load(QVariantMap map)
{
loadMyself(map);
}
}

编辑:

Qt 属性的初始化要访问 Qt 属性,您不需要指向添加了真实属性的类实例的指针。
只需使用 this->property("_a")this->property("_b")但是属性名称应该是唯一的。当你申报属性(property)时 _aNodeB你覆盖属性 _aNodeA它变得无法再通过 Qt 元系统访问。

关于c++ - 从类名转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25607932/

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