2012-05-14 1 views
3

나는 fallowing 헤더 파일을 가지고 있습니다. 이 오류가 발생합니다 : expected ')' before 'A' 왜 이까요? 나는 아이디어에서 ... 난`을 재 작성하고 교체 시도하고 난 종속성 헤더의 내용, ... 문제의 원인이 될 수 있습니다 알고헤더 파일 ~ synatx 오류 (괄호를달라고하는 것)

#ifndef UICONSOLE_H_ 
#define UICONSOLE_H_ 

#include "Catalog.h" 

#include <string> 

using namespace std; 

class UIconsole{ 
public: 
    UIconsole(Catalog A); // error here. 
    void runUI(); 

private: 
    void showMenu(); 
    string getString(); 
    int getOption(); 

    void addStudent(); 
    void removeStudent(); 
    void editStudent(); 
    void printStudent(); 
    void printAllStudents(); 


    void addAssignment(); 
    void removeAssignment(); 
    void editAssignment(); 
    void printAssignment(); 
    void printAllAssignment(); 

    void printAllUnder5(); 
    void sortAlphabetically(); 
    void searchById(); 
}; 
#endif /* UICONSOLE_H_ */ 

편집을 해달라고 :

#ifndef CATALOG_H_ 
#define CATALOG_H_ 
#include <string> 

#include "UIconsole.h" 
#include "Catalog.h" 

#include "StudentRepository.h" 
#include "StudentValidator.h" 

using namespace std; 

class Catalog{ 
private: 
    StudentRepository studRepo; 
    StudentValidator studValid; 

public: 
    Catalog(StudentRepository stre, StudentValidator stva):studRepo(stre),studValid(stva){}; 
    void addNewStudent(string name, int id, int group); 
    void removeStudent(string name); 
    void editStudent(int name, int id, int group); 
    Student seachStudent(string name); 
}; 

#endif /* CATALOG_H_ */ 
+0

Catalog.h –

+3

의 내용도 표시 할 수 있습니까?'Catalog.h'는 예상 한대로 수행되지 않습니다. 컴파일러가'Catalog'에 대한 선언을 아직 보지 못했기 때문에 오류가 발생합니다. . –

+0

@MichaelBurr 답변으로 게시해야한다고 생각합니다. –

답변

3

귀하의 Catalog.h 파일이 필요 #include 지침 몇 가지가 있습니다.

#include "Catalog.h"은 불필요하지만 무해합니다 (포함 경비원으로 인해). 그러나 #include "UIconsole.h"class Catalog 선언 전에 class UIconsole의 선언을 처리합니다. 컴파일러는

UIconsole(Catalog A); 

라인 안타 그래서 때 여전히 Catalog이 무엇인지 모르고있다. 이 문제와 관련되지 않은 있지만 수정해야

또 다른 것은 헤더 파일에서

using namespace std; 

지침입니다.

void addNewStudent(std::string name, int id, int group); 
void removeStudent(std::string name); 

헤더의 모든 사용자에 대한 전역 네임 스페이스에 네임 스페이스를 강제로 문제가 경우가 발생할 수 있습니다 헤더 파일에 당신은 일반적으로 std 네임 스페이스 유형의 전체 이름을 지정해야합니다 - 즉 피해야한다 나쁜 습관이다 이름 충돌이 있습니다 (본질적으로 사용자가 지시어를 강요하면 사용자가 이름 공간과의 충돌을 제어 할 수 없게됩니다).

+0

네, 고쳤습니다 ...'Catalog.h'에'Catalog.h'의 포함을 보지 못했습니다 ... 감사합니다. –

0

순환 포함이 있습니다. 카탈로그에는 콘솔이 포함되어 있으며 다시 카탈로그가 포함됩니다. 이제 보호 장치가 무한한 포함을 방지하지만 마술처럼 문제를 해결하지는 못합니다.

이 경우 그 가정하자, 카탈로그 먼저 포함되어

컴파일러는 않습니다 :

  • 는 카탈로그를 포함한다. h
  • 에는 Console.h가 포함됩니다.
  • 안전을 위해 실제로 Catalog.h를 포함하지만 내용을 건너 뜁니다.
  • 계속해서 Console.h를 처리하지만 Catalog 클래스를 아직 보지 못했습니다.

순환 포함을 해결해야합니다. 한 가지 방법은 객체 카탈로그 대신 포인터를 놓고 전달 선언을하는 것입니다. 또는 헤더에 필요하지 않은 것처럼 Catalog.h에서 include UIconsole.h를 간단히 제거 할 수 있습니다.

#include "UIconsole.h" 
#include "Catalog.h" 

는 특정 파일이 제거하십시오 :