我想知道为什么当你制作一个QList of QFIle时,你必须给它们做指针。例如,我有一个类具有一个QList< QFile* >:
class Files
{
public:
void AddFile(QString newFile);
private:
QList<QFile*> files;
}现在,当调用AddFIle时,它会这样做:
QFile* newt = new QFile(new_File);
files += newf;为什么我不能将QList< QFile* >更改为QList< QFile >?每次我尝试这样做,我都会犯一个错误:
QFIle::QFile(const &)是私有
下面是将代码更改为QList< QFile >时的样子:
class Files
{
public:
void AddFile(QString newFile);
private:
QList<QFile> files;
}然后是.cpp
QFile newt(new_File);
files += newf;发布于 2014-02-28 02:23:45
在您的示例中,必须将QFile类型用作*QFile,因为作者将复制构造函数设置为私有。QList类型需要访问其模板参数的复制构造函数。无法访问QFile的复制构造函数,但QFile*类型具有可访问的复制构造函数。
这很可能是故意的。复制QFile对象可能是不安全的。
发布于 2014-02-28 02:35:50
简短的回答:由于复制QFile对象是危险的,作者使复制不可能(通过将复制构造函数设置为私有)。
较长的答覆:
发布于 2014-02-28 14:54:48
它非常简单: QList有点“缺陷”,因为它只支持可复制的对象。QObjects是不可复制的.QFile是QObject。仅此而已。
C++11的std::list确实支持QObject
如果您使用C++11,并且有一个容器支持就地构造,并且不需要复制或默认构造它所包含的对象,那么当然可以在其中存储对象实例。下面的内容同时适用于Qt4和Qt5:
#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,因此它有内部缓冲区。现在,告诉我您希望这段代码产生什么:
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。
https://stackoverflow.com/questions/22084921
复制相似问题