追加到 QList<QFile*>
Appending onto QList<QFile*>
我想知道为什么当你制作QFIle的QList时,你必须让它们成为指针。例如,我有一个类,它有一个QList<Q文件*>:
class Files
{
public:
void AddFile(QString newFile);
private:
QList<QFile*> files;
}
现在,当调用AddFIle时,它会执行以下操作:
QFile* newt = new QFile(new_File);
files += newf;
为什么我不能更改QList<QFile**到QList<Q文件>?每次我尝试这样做时,我都会得到一个错误:
QFIle::QFIle(const QFIle&)是私有的
以下是当我将代码更改为QList<Q文件>:
class Files
{
public:
void AddFile(QString newFile);
private:
QList<QFile> files;
}
然后.cpp
QFile newt(new_File);
files += newf;
在您的示例中,QFile
类型必须用作*QFile
,因为作者将复制构造函数设置为私有的。QList
类型需要访问其模板参数的复制构造函数。无法访问QFile
的复制构造函数,但QFile*
类型具有可访问的复制构造函数。
这很可能是故意的。复制QFile
对象可能是不安全的。
简单回答:由于复制QFile对象是危险的,作者使其无法复制(通过使复制构造函数私有)。
长答案:
-
Qt对QObjects的内部处理:大多数非平凡的Qt对象都是堆生成的,其中许多对象都有特殊的内部变量,如果使用得当,它们的内存(以及生命和引用)可以由Qt内部管理。因此,处理Qt对象的首选方式是作为指针。Qt提供多个智能指针以便于使用。
-
一般的资源处理:另一个原因是,即使没有Qt的内部结构,在不使用句柄的情况下共享资源对象的副本也是个坏主意。
这真的很简单:QList有点"不足",因为它只支持可复制的对象。QObjects是不可复制的。QFile
是一个QObject。仅此而已。
C++11的std::list支持QObject
如果你使用C++11,并且有一个支持就地构建的容器,不需要复制也不需要默认构建它所包含的对象,那么你当然可以在其中存储对象实例
#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("abcdefn");
}
为什么QFile不可复制
想想QObject必须做什么,然后想想副本的语义是什么。确保你已经考虑了线程、信号和插槽。然后你会意识到,几乎每个想复制QObject的人都会对这样一个QObject副本的作用提出不同的语义。因此,它实际上是无用的,因为人们通常会忽略文档,因此会有很多错误。我了解自己,因为我曾经修改过自己的Qt副本,允许复制QObject。最终,除了最琐碎的情况外,它在任何情况下都会适得其反。现在我们不要忘记,我们只讨论了QObject复制的语义。
不要忘记,QFile是一个QIODevice,因此它有内部缓冲区。现在告诉我你期望这段代码产生什么:
QFile foo("file");
foo.open(QIODevice::WriteOnly);
foo.write("foo");
QFile bar(foo);
bar.write("bar");
bar.close();
foo.close();
现在假设您已经更改了close()
调用的顺序:
bar.close();
foo.close();
这只是为了写作。现在假设我们有这样的代码:
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。
- EASTL矢量<向量<int>>连续的
- 如何从QFile阅读?它显示该文件不可访问
- QDial:如何将 int 值传递给需要常量字符*的 Qfile?
- QDataStream 读取和写入的字节数比 QFile::length() 报告要多
- Qt 写入 xml: QIODevice::write (QFile, "D:/logs.xml" ): 设备未打开
- Qt中的QFile::copy(source,dest)的实现有时是错误的吗?
- 使用 QFile::write 的正确方法?
- 在 Windows QDir::mkpath 和 QFile::rename 上报告成功,尽管失败了
- qfile qtextStream仅读取文件的一部分
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 使用自动初始化 QFile
- 如何使用 QFile、c++ 从文件创建整数数组
- 无法创建QFILE(仅使用MSVC2017 UWP)
- C 字符串比较“祝您好运”&gt;“再见”
- QFILE INIT/分配OP问题当对象是类成员时
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何确保QFile写入相同的物理地址?
- 在关闭 QFile 之前是否需要刷新 QTextStream?
- Qt - 为什么无法使用 QFile 读取文件,其中包含从 FileDialog 获取的目录
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一