0

オブジェクトsettingsからすべての値を表示したいダイアログ ウィンドウがあり、そのためにはinheritの保護されたメンバーが必要です。breadData を前方宣言しようとしましたが、コードでいくつかのエラーが発生しました。breadDatasettingsbreadData

/home/--/breadPull/prj/settings.h:14: error: invalid use of incomplete type 'struct breadData'
/home/--/breadPull/prj/resultwnd.h:7: error: forward declaration of 'struct breadData'

1breadDataつには、構造体ではありません。なぜコンパイラは、breadData が構造体であると考えるのでしょうか? 第二に、二行目が何を言おうとしているのか理解できない。私の唯一の推測は、私のプログラムには多くの循環依存関係があるためです。関連するコードは次のとおりです。

settings.h

#include <QDialog>
#include "breaddata.h"

class breadData;

namespace Ui {
class Settings;
}

class Settings : public QDialog, public breadData
{
    Q_OBJECT
    //.....

breadData.h

#include <vector>
#include <string>
#include <QtWidgets>
#include <QMainWindow>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "resultwnd.h"
#include "settings.h"


class MainWindow;
class resultWnd;

class breadData
{
public:
    breadData(std::string);
    ~breadData();
    //read in data file that provides all information
    bool readData();

    //.......

結果Wnd.h

include <QGroupBox>
#include "breaddata.h"

class breadData;

namespace Ui {
class resultWnd;
}

class resultWnd : public QGroupBox
//.....
4

2 に答える 2

1

あなたの問題は、次のことを完全に理解していないことです。

  1. プリコンパイラ
  2. 宣言と定義の違いと前者の使用目的。
  3. namespaceの目的と用途

あなたが示したものよりもコードについて詳しく知らなくても、次のようにして問題を解決する必要があります。

settings.h

#ifndef SETTINGS_H
#define SETTINGS_H

// Your code as above

#endif

パンデータ.h

#ifndef BREADDATA_H
#define BREADDATA_H

// Your code as above

#endif

結果Wnd.h

#ifndef RESULTWND_H
#define RESULTWND_H

// Your code as above

#endif

ただし、これで問題が完全に解決されるわけではないと思います。2 番目のエラー メッセージに基づいて、重要なコード行を質問から除外したため、問題を解決するための決定的な回答を誰も提供できないと思われます。

breadData質問のコードを編集して、Settingsを含むすべての行を含めることをお勧めします。resultWnd

これを解決することは可能です。3 つのクラスがどのように結合されているかを確認するだけで、それらを解きほぐすことができます。



コンパイラが a を使用していると考える理由は、struct純粋に歴史的なものです。このclassキーワードは、 を置き換える意図で C++ に導入されましたstruct。以前の C では、structキーワードのみが存在していました。struct私の知る限り、 s とclassesの唯一の違いはデフォルトのアクセス レベルです。classes のデフォルトは ですがprivatestructs のデフォルトはpublicです。それ以外の場合は、同じ使用方法があります。

于 2013-10-30T06:58:08.963 に答える