2013-10-29 2 views
0

'불완전한 유형의 잘못된 사용은'나는 내 breadData 객체에서 모든 값을 표시하고, 나는 settings 상속 breadData의 보호 회원을 갖고 싶어 그렇게 원하는 대화 창 settings 있습니다. breadData 선언을 전달하려고하지만 코드에 몇 가지 오류가 발생합니다. 하나다중 상속 오류

/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' 

breadData, 왜 컴파일러가 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(); 

    //....... 

resultWnd.h

include <QGroupBox> 
#include "breaddata.h" 

class breadData; 

namespace Ui { 
class resultWnd; 
} 

class resultWnd : public QGroupBox 
//..... 
+0

'breaddata.h '는'settings.h'를 포함하고 그 반대도 마찬가지입니다. 이것은 순환 의존성을 포함하며 작동하지 않습니다. 다행히도 그것에 대해 많은 의문점이 있습니다. – juanchopanza

+0

@juanchopanza'MainWindow'와'breadData'도 원형 의존성이고 작동합니다. 헤더 파일에 구현이 포함되어 있지 않은 한 –

+0

제대로 작동하면 우연히 작동합니다. 순환 종속성을 제거해야합니다. – juanchopanza

답변

1

순환 종속성이 있습니다. breaddata.h는 breaddata를 선언하기 전에 settings.h를 포함합니다. settings.h에는 상속에 대한 breaddata 선언이 필요합니다. 따라서

제 breaddata 포함 (포함 헤더 파일의 재귀 삽입 시각화 압입)이 보이는 파일을 컴파일 할 때 전처리 작성하는 파일 : 요약

<content of breaddata.h>: 
    <content of vector, string, QtWidget, QMainWindow, mainwindow.h and ui_mainwindow.h> 
    ... 
    <content of resultWnd>: 
     ... 
     class breaddata; //forward declaration mentioned in the error message 
     ... 
    <content of settings.h>: 
     ... 
     class Settings : public QDialog, public breadData //DANG! 
     ... 
    class breaddata { ... //too late 

:

class breaddata; //forward declaration mentioned in the error message 
... 
class Settings : public QDialog, public breadData //DANG! 
... 
class breaddata { ... //too late 

을 여기 해결책은 breaddata.h, 특히 settings.h에있는 include를 피하는 것입니다. 필요한 경우 설정을 미리 선언하십시오. 경험 법칙은 꼭 필요한 경우에만 헤더에 포함하고 가능할 때마다 앞으로 선언하십시오.

1

귀하의 문제는 당신이 다음의 불완전한 이해를 가지고있다 :

  1. 프리 D 파일러
  2. 선언과 정의와 전자를 사용하는 목적의 차이.
  3. 당신이 보여준 것보다 코드에 대한 자세한 내용을 모른 채 namespace

의 목적과 사용은 다음이 문제 해결해야

settings.h을

#ifndef SETTINGS_H 
#define SETTINGS_H 

// Your code as above 

#endif 

breaddata.h

#ifndef BREADDATA_H 
#define BREADDATA_H 

// Your code as above 

#endif 

tWnd.h

#ifndef RESULTWND_H 
#define RESULTWND_H 

// Your code as above 

#endif 

나는 이것이 당신의 문제를 완전히 해결하지 못할 것으로 생각합니다.두 번째 오류 메시지를 기반으로 질문에서 중요한 코드를 남겨 두었으므로 누구도 문제를 해결할 수있는 확실한 답을 줄 수 없습니다.

나는 당신이 breadData, SettingsresultWnd

이 문제를 해결 할 수 있습니다를 포함하는 모든 행을 포함하도록 해당 코드를 편집 제안, 우리는 단지 세 가지 클래스가 함께 결합하는 방법을 볼 필요가 그래서 우리는 당신이 그들을 풀 수 있도록 도와 줄 수 있습니다.



컴파일러는 당신이 struct을 사용하고 생각하는 이유는 순전히 역사입니다. class 키워드는 struct을 대체 할 C++에 도입되었습니다. 이전에는 C에서 struct 키워드 만 존재합니다. 내가 아는 한 structclass 사이의 유일한 차이점은 기본 액세스 수준입니다. class의 기본값은 private이고 struct의 기본값은 public입니다. 그렇지 않으면 동일한 사용법을가집니다.