3

我有闲置的头文件。我收到此错误: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_ */
4

2 回答 2

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);

当存在名称冲突时,将名称空间强制进入标头的所有用户的全局名称空间可能会导致问题(本质上,如果您对用户强制执行指令,您将无法控制用户与名称空间的名称冲突)。

于 2012-05-14T19:11:59.873 回答
0

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

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

编译器会:

  • 包括目录。H
  • 包括控制台.h
  • 包括 Catalog.h 但实际上由于安全措施而跳过了内容。
  • 继续处理 Console.h 但它还没有看到 Catalog 类。

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

于 2012-05-14T19:11:28.627 回答