我刚刚开始使用C ++,但我已经遇到了问题。我正在尝试制作一个名为brushInput的QFile(来自QTCore)。它说“预期宣言”。我查了一下它似乎是出现语法问题,但我没有在我的代码中看到。是否有课。
#include <QtCore>
class Ink
{
QFile *brushInput;
brushInput = new QFile("x:\Development\InkPuppet\brush.raw");
};
答案 0 :(得分:3)
您无法在类定义中进行分配。但是,您可以在C ++ 11的类定义中进行默认初始化:
class Ink
{
QFile* brushInput = new QFile("x:\\Development\\InkPuppet\\brush.raw");
};
但是,通常我会期望初始化进入构造函数:
class Ink
{
QFile* brushInput;
public:
Ink(): brushInput(new QFile("x:\\Development\\InkPuppet\\brush.raw")) {}
};
答案 1 :(得分:1)
您不能在类内进行分配,只能进行初始化。因此,请使用您的类的成员初始化列表:
class Ink
{
QFile *brushInput;
public:
Ink() : brushInput(new QFile("x:\Development\InkPuppet\brush.raw"));
};
答案 2 :(得分:0)
此:
brushInput = new QFile("x:\Development\InkPuppet\brush.raw");
是一份声明。语句(声明除外)只能出现在函数定义中,而不能出现在类或文件范围内。
将语句放在函数定义(可能是构造函数)中确定何时执行语句。如果你认为它应该在创建对象时执行 - 那么,这就是构造函数的用途。
答案 3 :(得分:0)
由于你是C ++的新手,所以要了解入门的一些事情:
在C ++中有两种源文件:头文件(.h)和源文件(.cpp)。 必须同时声明和实现C ++中的所有内容。这是两件不同的事情。 一般规则是声明进入头文件,实现进入.cpp文件。
在你的情况下:
//ink.h file
#ifndef INK_H //this avoids multiple inclusion
#define INK_H
#include <QtCore>
class QFile; //let the compiler know the QFile is defined elsewhere
class Ink
{
public: //as a rule of thumb,
//always declare the visibility of methods and member variables
Ink(); //constructor
~Ink(); //it is a good practice to always define a destructor
private:
QFile *brushInput;
};
#endif
//.cpp file
#include "ink.h"
//implementation of the constructor
Ink::Ink() :
brushInput(new QFile("x:/Development/InkPuppet/brush.raw"); //you can use forward slashes; Qt will convert to the native path separators
{}
避免在头文件中实现
作为第二条规则,避免在头文件中实现,当然是构造函数和析构函数
头文件中方法的实现称为内联方法(它们必须标记为这样)。首先,避免使用它们,并尝试在.cpp文件中实现所有内容。当您更熟悉C ++时,可以开始使用“更高级”的东西。