首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >附加到QList<QFile*>上

附加到QList<QFile*>上
EN

Stack Overflow用户
提问于 2014-02-28 02:21:04
回答 3查看 1.3K关注 0票数 1

我想知道为什么当你制作一个QList of QFIle时,你必须给它们做指针。例如,我有一个类具有一个QList< QFile* >:

代码语言:javascript
复制
class Files
{
public:
   void AddFile(QString newFile);

private:
QList<QFile*> files;
}

现在,当调用AddFIle时,它会这样做:

代码语言:javascript
复制
QFile* newt = new QFile(new_File);
files += newf;

为什么我不能将QList< QFile* >更改为QList< QFile >?每次我尝试这样做,我都会犯一个错误:

QFIle::QFile(const &)是私有

下面是将代码更改为QList< QFile >时的样子:

代码语言:javascript
复制
class Files
{
public:
   void AddFile(QString newFile);

private:
QList<QFile> files;
}

然后是.cpp

代码语言:javascript
复制
QFile newt(new_File);
files += newf;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-28 02:23:45

在您的示例中,必须将QFile类型用作*QFile,因为作者将复制构造函数设置为私有。QList类型需要访问其模板参数的复制构造函数。无法访问QFile的复制构造函数,但QFile*类型具有可访问的复制构造函数。

这很可能是故意的。复制QFile对象可能是不安全的。

票数 2
EN

Stack Overflow用户

发布于 2014-02-28 02:35:50

简短的回答:由于复制QFile对象是危险的,作者使复制不可能(通过将复制构造函数设置为私有)。

较长的答覆:

  1. QObjects的Qt内部处理:大多数重要的Qt对象都是堆生成的,其中许多人具有特殊的内部变量,在正确使用时,这些变量允许Qt在内部管理它们的内存(以及生命和引用)。因此,处理Qt对象的首选方法是作为指针。为了便于使用,Qt提供了多个智能指针
  2. 资源处理:另一个原因是,即使没有Qt的内部结构,不使用句柄共享资源对象的副本也是个坏主意。
票数 2
EN

Stack Overflow用户

发布于 2014-02-28 14:54:48

它非常简单: QList有点“缺陷”,因为它只支持可复制的对象。QObjects是不可复制的.QFile是QObject。仅此而已。

C++11的std::list确实支持QObject

如果您使用C++11,并且有一个容器支持就地构造,并且不需要复制或默认构造它所包含的对象,那么当然可以在其中存储对象实例。下面的内容同时适用于Qt4和Qt5:

代码语言:javascript
复制
#include <QFile>
#include <QDir>
#include <list>

int main()
{
   std::list<QFile> files;
   files.emplace_back(QDir::homePath() + QDir::separator() + "test.txt");
   files.front().open(QIODevice::WriteOnly);
   files.front().write("abcdef\n");
}

为什么QFile是不可复制的?

想想QObject必须做什么,然后想一想副本的语义。确保您已经考虑到线程、信号和插槽。然后,您就会意识到,几乎每一个想要复制QObject的人都会想出不同的语义来描述这样一个QObject副本所要做的事情。因此,它实际上是无用的,因为人们通常忽略文档,而且由于这个原因,会出现大量的bug。我了解自己,因为我曾经修改过自己的Qt副本,以允许QObject复制。最后,它最终证明,它完全适得其反,在任何情况下,但最微不足道的情况。现在,我们不要忘记,我们只触及了QObject复制的语义。

不要忘记,QFile是一个QIODevice,因此它有内部缓冲区。现在,告诉我您希望这段代码产生什么:

代码语言:javascript
复制
QFile foo("file");
foo.open(QIODevice::WriteOnly);
foo.write("foo");
QFile bar(foo);
bar.write("bar");
bar.close();
foo.close();

现在假设您更改了close()调用的顺序:

代码语言:javascript
复制
bar.close();
foo.close();

这只是用来写作的。现在假设我们有以下代码:

代码语言:javascript
复制
QTcpSocket socket;
socket.connectToHost("localhost", 8080);
socket.waitForConnected(); // do not use it in production code!!
QTcpSocket socket2(socket);
qDebug() << socket.read(3);
qDebug() << socket2.read(3);

考虑到连接的另一方已经发送了"abcdef",您期望输出是什么?

换句话说:您不希望能够复制QIODevice。

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

https://stackoverflow.com/questions/22084921

复制
相关文章

相似问题

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