在Qt中创建模型时出现多个错误

时间:2011-05-18 06:45:07

标签: c++ class compiler-errors

我在Qt中创建了一个类。但是一切都在工作,直到我构建了一个tablemodel类。我现在收到错误"expected ( before * token“和"Creator does not name a type"。 有什么问题?这看起来很神秘。

#ifndef OPENMODEL_H
#define OPENMODEL_H

#include <QAbstractTableModel>
#include <QString>
#include <QObject>

#include "creator.h"

namespace language
{
    class OpenModel : public QAbstractTableModel
    {
        Q_OBJECT

    public:
        explicit OpenModel(Creator* creator, QObject *parent = 0); // Creater* throws a expected ) before * token

        // QAbstractTableModel Model view functions
        int rowCount(const QModelIndex &parent = QModelIndex()) const ;
        int columnCount(const QModelIndex &parent = QModelIndex()) const;
        QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
        QVariant headerData(int section, Qt::Orientation orientation, int role) const;

        // QAbstractTableModel Model edit functions
        bool setData(const QModelIndex & index, const QVariant & value, int role);
        Qt::ItemFlags flags(const QModelIndex &index) const;

        // Functions to manipulate creator
        void add(QString name, QString file);
        void remove(int index);

        // Functions to move files up and down
        void moveup(int index);
        void movedown(int index);

    private:
        Creator* creator; // Creator does not name a type

    };
}

#endif // OPENMODEL_H

这是creator.h

/*
  This is the main file for the language-creator

  It controls the addition, deletion and change of the centances (files)
  It shall be passed by pointer to the models to be proccessed
  */

#ifndef CREATOR_H
#define CREATOR_H

#include <QObject>
#include <QVector>

#include "file.h"
#include "openmodel.h"
#include "setmodel.h"

namespace language
{
    class Creator
    {

    public:
        Creator();

        void addFile(const File& f); // Adds a file to the vector
        bool removeFile(int index); // Remove a file from the vector
        bool replaceFile(int index, const File& f); // Replaces a file at index

        const QVector<File>* getFiles() const; // Returns a list of the files

        OpenModel getOpenModel() const; // Returns a pointer to the open model
        SetModel getSetModel() const; // Returns a pointer to the set model

        void reset(); // This resets the class to an initialized state

    private:
        QVector<File> files; // This holds all the files
    };
}

#endif // CREATOR_H

2 个答案:

答案 0 :(得分:3)

这些头文件之间有一个循环引用。 openmodel.h包括creator.h,反之亦然。因此,当creator.cpp(我假设有这样的文件)被编译时,它会在声明类openmodel.h之前包含Creator(请记住#include表示内容该文件将被粘贴在那里),因此你得到错误。

为避免这种情况,您可以从#include "creator.h"中移除openmodel.h,然后添加转发声明:

class Creator;

将声明放在课程OpenModel之前。由于您只在该类中使用指向Creator的指针,因此可以正常工作。

答案 1 :(得分:0)

您的creator.h文件包含openmodel.hCreator使用createor.h标识符,class Creator;之前已对其进行了更改。

openmodel.h中添加{{1}}转发声明。