头文件〜语法错误(要求括号)

时间:2012-05-14 18:56:05

标签: c++ syntax circular-dependency

我有头文件头文件。我收到此错误:expected ')' before 'A'为什么会这样? 我试图改写并替换......我没有想法,我不知道问题的根源是什么......

#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_ */

2 个答案:

答案 0 :(得分:3)

您的Catalog.h文件有几个不必要的#include指令:

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

从特定文件中删除这些内容。

#include "Catalog.h"是不必要的,但无害(因为包含警卫)。但是,#include "UIconsole.h"会导致在class UIconsole声明之前处理class Catalog的声明。所以当编译器点击

UIconsole(Catalog A);

行,它仍然不知道Catalog是什么。

与此问题无关但应该修复的另一件事是

using namespace std;
头文件中的

指令。这是一个应该避免的错误做法 - 在头文件中,您通常应该在std命名空间中指定类型的全名:

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

在名称冲突时强制命名空间进入标头的所有用户的全局命名空间可能会导致问题(实质上,如果您强制使用指令,则删除了用户控制与命名空间的名称冲突的能力)。

答案 1 :(得分:0)

您有一个循环包含:目录包括控制台,而控制台又包含目录。现在安全防止无限包括,但它并没有神奇地解决问题。

让我们假设在您的情况下,首先包含目录:

编译器执行:

  • 包括目录。 ħ
  • 包括Console.h
  • 包含Catalog.h但实际上由于安全措施而跳过了内容。
  • 继续处理Console.h但尚未看到Catalog类。

你需要解决循环包含问题。一种方法是放置指针而不是对象Catalog并具有前向声明。或者您只需从Catalog.h中删除include UIconsole.h,因为标题中似乎不需要它。