gpt4 book ai didi

c++ - XML解析后变量设置函数指针的QHash : insane?

转载 作者:太空宇宙 更新时间:2023-11-04 12:19:57 25 4
gpt4 key购买 nike

我正在以 XML 格式解析和存储从服务器获取的数据。该应用程序是一个瘦客户端,它非常频繁地请求这样的服务器端数据。一些变量将是触发更多网络调用的 uris。数据的形式是:

<object>
<var1>value</var1>
...
<varN>value</varN>
</object>

对象中有大约 50 个变量。该对象由一个 MyObject 类镜像,该类具有所有变量的 getter 和 setter(它们属于不同类型,将被其他各种类访问)。

我一直在使用 QXmlStreamReader,这很好,但我最终得到了很多

if (reader.name() == "var1")
{
...
}

条目,我想一定有更好的方法?

我写了一些快速原型(prototype)代码,其中 MyObject 有一个函数,它接受 (name, entry),并通过 name 索引到函数指针的 QHash 中,返回setter 到条目,它调用传递 entry。这感觉不像 Qt 风格,并且可能会让 future 的维护者感到困惑:

在标题中:

typedef void (Foo::*setValue)(QString& value);
QHash<QString, Foo::setValue> m_settersMap;

.cpp:

MyObject::MyObject(QObject *parent) :
QObject(parent)
{
m_settersMap["var1"] = &MyObject::setVar1;
m_settersMap["var2"] = &MyObject::setVar2;
...
m_settersMap["varN"] = &MyObject::setVarN;
}

void MyObject::set(QString &name, QString &entry)
{
MyObject *foo = this;
MyObject::setValue setter;
setter = m_settersMap.value(key);
(*foo.*setter)(value);
}

void MyObject::setVar1(QString &entry)
{
m_foo1 = entry;
}

...

来自 XML 处理程序:

MyObject foo;

...

if(reader.isStartElement())
{
foo.set(reader.name(), reader.readEntryText());
}

这样一来,XML 处理程序中的复制意大利面就少了很多,但会增加 QHash 的开销,并且可能会混淆非直接的实现(我一直怀疑这不是解决之道)。

那么这是合法的还是疯狂的,我是不是错过了一些非常明显的东西?

最佳答案

我会向您推荐另一种“更简单”的解决方案,它将帮助您:

1) 拥有更少的代码并使您的代码可读2) 不要用函数调用淹没另一个对象

所以你可以使用QObject properties要做到这一点。你的代码看起来很简单:

// parsing the XML here via QXmlStreamReader
...
QObject *object = new QObject;
...
object->setProperty(reader.name(), reader.value());

然后你可以像这样在代码中引用你对象的一个​​变量:

QString name = object->property("var1").toString();

您可能希望扩展 QObject 以摆脱一直调用 .toString() 或类似方法的必要性。

关于c++ - XML解析后变量设置函数指针的QHash : insane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5649158/

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