C ++“期待一个宣言”

时间:2013-08-24 23:37:35

标签: c++ qt

我刚刚开始使用C ++,但我已经遇到了问题。我正在尝试制作一个名为brushInput的QFile(来自QTCore)。它说“预期宣言”。我查了一下它似乎是出现语法问题,但我没有在我的代码中看到。是否有课。

#include <QtCore>

class Ink
{
    QFile *brushInput;

    brushInput = new QFile("x:\Development\InkPuppet\brush.raw");
};

4 个答案:

答案 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 ++的新手,所以要了解入门的一些事情:

  1. 在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
    {}
    
  2. 避免在头文件中实现
    作为第二条规则,避免在头文件中实现,当然是构造函数和析构函数 头文件中方法的实现称为内联方法(它们必须标记为这样)。首先,避免使用它们,并尝试在.cpp文件中实现所有内容。当您更熟悉C ++时,可以开始使用“更高级”的东西。