我来自Java背景,最近决定尝试创建一个"有趣"的C++ Qt GUI应用程序.我一直在努力解决Java和c ++之间的许多细微差别,但我学到了很多东西.
我试图在我的C++编码中尽可能地匹配"java风格"语法.虽然这可能是也可能不是C++的"最佳实践",但我觉得在学习保持熟悉且一致的语法时会有所帮助.其中一个java语法残留是这样的:
//Java
MyObject o = new MyObject();
//C++
MyObject o = MyObject();
Run Code Online (Sandbox Code Playgroud)
现在,我理解C++有上面的语法快捷方式:
//C++
MyObject o();
Run Code Online (Sandbox Code Playgroud)
这很好,但正如我所说,我不想使用不同的语法.一切都很好,但是当我尝试下面的Qt代码时,我收到了一个惊喜:
QString filepath = "C:\\somefile";
QFile file = QFile(filepath);
Run Code Online (Sandbox Code Playgroud)
并得到编译错误:
c:\QtSDK\Desktop\Qt\4.7.2\mingw\include/QtCore/qfile.h:195: error: 'QFile::QFile(const QFile&)' is private within this context
Run Code Online (Sandbox Code Playgroud)
我读了Qt文档,发现确实没有公共构造函数QFile :: QFile(const QFile&).我的代码以前用于其他类的地方,有这样的构造函数.我可以在这里猜测并说出这条线:
QFile file = QFile(filepath);
Run Code Online (Sandbox Code Playgroud)
实际上是调用两个构造函数.谁能解释一下?
//Java
MyObject o = new MyObject();
//C++
MyObject o = MyObject();
Run Code Online (Sandbox Code Playgroud)
这些并不等同.c ++版本在堆栈上创建一个新对象,java只能用基本类型创建.一旦o超出范围,它将被破坏.上面实际发生的是逻辑上MyObject o(MyObject());(不正确的实际语法) - 构造后跟复制构造.
MyObject * o = new MyObject();
Run Code Online (Sandbox Code Playgroud)
这与你的java版本一样接近.当然,需要注意的是,在C++中你还需要delete o;- 它不会被垃圾收集.
QFile file = QFile(filepath);
Run Code Online (Sandbox Code Playgroud)
这将再次在堆栈上创建一个临时QFile,然后file通过从临时复制构造它来创建.它相当于QFile file(QFile(filepath));.在你的情况下这不起作用,QFile不允许复制构造,所以你需要通过直接构建QFile来避免临时,
// on stack:
QFile file(filepath);
//or in heap:
QFile * file = new QFile(filepath);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |