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であるかわかりません。

この問題とは関係ありませんが、修正する必要があるもう1つのことは

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
  • Console.hを含める
  • Catalog.hを含めますが、安全のために実際にはコンテンツをスキップします。
  • Console.hの処理を続行しますが、Catalogクラスはまだ表示されていません。

循環インクルードを解決する必要があります。1つの方法は、オブジェクトカタログの代わりにポインターを配置し、前方宣言を行うことです。または、インクルードUIconsole.hをCatalog.hから削除することもできます。これは、ヘッダーでは必要ないようです。

于 2012-05-14T19:11:28.627 に答える