首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用嵌入的私有类重写Qt类

问用嵌入的私有类重写Qt类
EN

Stack Overflow用户
提问于 2012-10-06 13:26:00
回答 2查看 2.6K关注 0票数 7

在许多情况下,我想重写Qt类来扩展或修改它的行为。但是几乎所有的Qt类都使用内部私有类,比如QNetworkDiskCache中的QNetworkDiskCachePrivate。我知道这种方法有很多优点。但是私有类有一个很大的问题:它使得重写类变得更加困难。对于其他带有源代码的C++类库,我通常会覆盖一个类方法,从父类中的实现中复制代码,并在这里和那里做一些小的修改,以实现我想要的行为。但是,在Qt中,私有类不会导出,并且对派生类不可见。由于Qt类通过"d“成员维护私有类中的关键内部数据,因此私有内部类的不可见性使得行为扩展的可能性非常有限。您只能使用少数公开的公共方法。

我尝试提取类的整个源文件,并重命名类名和文件名。但是Qt类库是如此错综复杂,以至于在大多数情况下,从其中提取单个类也是很麻烦的。

我是不是漏掉了什么?或者Qt类在可扩展性方面真的很差?

EN

回答 2

Stack Overflow用户

发布于 2012-10-17 22:41:00

就可扩展性而言,Qt类比大多数类都要好;它们通常有钩子来更改自己的行为,而不需要复制和粘贴整个方法。话虽如此,如果普遍接受的扩展方法不起作用,是的,Qt类更难破解。这可能是一件好事,因为复制-粘贴-修改基类实现意味着您的派生类不会得到基类实现中的任何改进或错误修复。

如果你想这样做,你需要说服你的构建系统允许你包含私有头,然后从你的新实现中引用私有类。请注意Qt文档中的免责声明;当您这样做时,您就会对发布的每个新版本的Qt造成破坏(Qt只保证公共API,而您正在扰乱它的内部结构)。Qt的公共API具有极好的可读性和文档化;内部代码可能非常隐蔽,因此您真的、真的希望确保不能使用公共API实现您想要的结果。如果你仍然决定使用私有类的东西,this might help。

票数 1
EN

Stack Overflow用户

发布于 2012-10-17 17:28:27

你的方法是错误和糟糕的!要扩展Qt和更一般的C++代码,您不必复制源代码并在需要的地方对其进行修改。您应该(必须)使用扩展的OOP(面向对象编程)范例。在C++中,您应该编写类似这样的代码:

代码语言:javascript
复制
#include <iostream>

using namespace std;

class A
{
public:
    A(){x=1;}
    void writeName(){cout << "my name is A";}
    void writeNumber(){cout << "my number is " << x << endl;}
private:
    int x;
};

class B : public A
{
public:
    B(){}
    void writeName(){cout << "my name is B and i'm better then A" << endl;}
};

int main()
{
   B *b= new B();
   b->writeName();
   b->writeNumber();
   return 0;
}

//output:
my name is B and i'm better then A
my number is 1

通过这种方式,B可以完成基类A所做的所有工作,而您可以添加您的方法(扩展基类)来满足您的需要。如果你看一下qt示例代码,这通常是用来做一些没有包含在默认qt小部件行为中的事情的方法。在示例ItemDelegate定制中:编写自己的类MyItemDelegate来扩展QItemDelegate:link

或Qt类在可扩展性方面真的很差吗?

Qt是构建C++语言的“唯一”框架。这意味着你可以在C++中做的所有事情都可以用Qt来做。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12757012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档