2016-05-28 8 views
0

私のコードに問題があります。コンパイラは、私が作成したすべてのCButtonポインタに対してこのエラーを表示し続けます。[Qt]: 'CButton'のタイプに名前がありません

/home/trafel/ドキュメント/Projects/C++/CCalc/ccalc.h:23: error : 'CButton' does not name a type 
    CButton *button_0; 
    ^

CButtonクラスはQPushButtonから拡張されています。ここ はメインヘッダからのコードです:

#ifndef CCALC_H 
#define CCALC_H 

#include <QWidget> 
#include <QMainWindow> 
#include <QPushButton> 
#include "clabel.h" 
#include "cbutton.h" 

class CCalc : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    CCalc(); 
    ~CCalc(); 

public slots: 
    void CPush(QString); 
    void CAction(QString); 

private: 
    CButton *button_0; 
    CButton *button_1; 
    CButton *button_2; 
    CButton *button_3; 
    CButton *button_4; 
    CButton *button_5; 
    CButton *button_6; 
    CButton *button_7; 
    CButton *button_8; 
    CButton *button_9; 
    CButton *button_equal; 
    CButton *button_plus; 
    CButton *button_minus; 
    CButton *button_multiply; 
    CButton *button_divide; 
    CButton *button_power; 
    CButton *button_root; 
    CButton *button_leftParenthesis; 
    CButton *button_rightParenthesis; 
    CButton *button_return; 
    CButton *button_ce; 

    CLabel *label_input; 
    CLabel *label_output; 

    QMenu *menu_session; 
     QAction *session_new; 
     QAction *session_open; 
     QAction *session_save; 
     QAction *session_quit; 
    QMenu *menu_log; 
     QAction *log_inspect; 
    QMenu *menu_help; 
     QAction *help_help; 
     QAction *help_about; 
}; 

#endif // CCALC_H 

そして、これは、CButtonクラスヘッダーからです:

#ifndef CBUTTON_H 
#define CBUTTON_H 

#include <QPushButton> 
#include "ccalc.h" 

class CButton : public QPushButton 
{ 
    Q_OBJECT 

public: 
    CButton(QWidget *parent); 
    ~CButton(); 
    QString getValue(); 
    void setValue(QString string); 

private: 
    QString value; 
}; 

#endif // CBUTTON_H 

私は何かを追加するのを忘れましたか?

+1

'ccalc.h'には' cbutton.h'が含まれていますが、 'cbutton.h'には' ccalc.h'が含まれています。それは良い考えではありません:http://stackoverflow.com/questions/14909997/whyarent-my-include-guards-preventing-recursive-inclusion-and-multiple-symbol。 'cbutton.h'から' ccalc.h'のインクルードを削除するだけのようです。 –

答えて

1

ショートソリューション:

ファイル"cbutton.h"で置き換える:

#include "ccalc.h" 

をして:

class CCalc; 

か、あなたがとにかくそれを使用していないようだと完全にその#includeを削除します。

説明:

あなたが循環依存関係を持って注意してください:"ccalc.h"にあなたはCButtonが何であるかを知っておく必要があり、かつ"cbutton.h"にあなたはCCalcが何であるかを知っておく必要があります。

これは(唯一の関連する行を示す)"cbutton.h"が最初に解析されている場合、あなたはこの順序でこれらの行を打つことを意味します:

1. #define CBUTTON_H  <-- from file "cbutton.h" 
2. #include "ccalc.h"  <-- from file "cbutton.h" 
3. #include "cbutton.h" <-- from file "ccalc.h", but as CBUTTON_H is already defined, the content of this file is ignored. 
4. CButton *button_0;  <-- from file "ccalc.h", which indeed refers to an undefined class, as we have not reached the line "class CButton" yet. 

"ccalc.h"にあなたがする必要がない場合、これらの例ではソリューションは、あります"cubutton.h"にあるメソッドを知っているだけで、クラスが存在することを知るには、そのクラスのプロトタイプをclass CButton;に置き換えます。同じことが#include "clabel.h"#include "clabel.h"に適用されます。

関連する問題