3

学校の課題で困っています。

私はクラスを持っています:

#include "Group.h"
#include <vector>
#include <string>
using namespace std;

class User{
    private :
        string username;
        vector<Group*> groups;
        void show() {
            for(int i=0; i<groups.size(); i++)
                cout << groups[i]->getName() << "\n";
        }
        string getUsername(){return username;}

};

#include "User.h"
#include <vector>
#include <string>
using namespace std;

class Group{
    private :
        string name;
        string getName(){return name;};
        User *f;
        vector<User*> m;
        void show(){
            for(int i=0; i<m.size(); i++)
                cout << m[i]->getUsername() << "\n";
        }
};

コンパイルしようとすると、エラーが発生します。

E:\Group.h|31|error: ISO C++ forbids declaration of 'User' with no type| E:\Group.h|31|error: expected ';' before '*' token|
E:\Group.h|33|error: 'User' was not declared in this scope|
E:\Group.h|33|error: template argument 1 is invalid|
E:\Group.h|33|error: template argument 2 is invalid|
E:\Group.h|36|error: 'User' was not declared in this scope|
E:\Group.h|36|error: template argument 1 is invalid|
E:\Group.h|36|error: template argument 2 is invalid|
E:\Group.h|47|error: 'User' has not been declared|
E:\Group.h|47|error: 'User' was not declared in this scope|
E:\Group.h|47|error: template argument 1 is invalid|
E:\Group.h|47|error: template argument 2 is invalid|
E:\Group.h|58|error: ISO C++ forbids declaration of 'User' with no type| E:\Group.h|58|error: expected ';' before '*' token|
E:\Group.h|59|error: 'User' has not been declared|
E:\Group.h|60|error: 'User' was not declared in this scope|
E:\Group.h|60|error: template argument 1 is invalid|
E:\Group.h|60|error: template argument 2 is invalid|
E:\Group.h|61|error: 'User' was not declared in this scope|
E:\Group.h|61|error: template argument 1 is invalid|
E:\Group.h|61|error: template argument 2 is invalid| ||=== Build finished: 21 errors, 4 warnings ===|

どうしたの?

class User;Group.hファイルとUser.hファイルに追加した場合にのみコンパイルされclass Group;ますが、一時的なソリューションだけでなく、適切なソリューションを探しているポイントではありません。

私のプロジェクト全体: http://www.speedyshare.com/jXYuM/proj.tar

4

3 に答える 3

17

周期的な依存関係があります。両方のファイルは、コンパイルするために互いに必要です。

グループ内の User を前方宣言してみてください:

#include <vector>
#include <string>

class User;

class Group{
    private :
        std::string name;
        std::string getName(){return name;};
        User *f;
        std::vector<User*> m;
        void show(); 
};

グループ.cpp

#include "Group.h"
#include "User.h"

using namespace std;

class Group
{
    .....

    void show() {
        for(int i=0; i<m.size(); i++)
        cout << m[i]->getUsername() << "\n";
    }

    .....
 }

次に、Group.cpp ファイルに User を含めます。

オブジェクトのサイズが前方宣言するオブジェクトの実際のサイズに依存しない場合はいつでも、ヘッダーで前方宣言を行うことができます。この場合、(グループ内で)ユーザーをポインターとして使用するため、グループのサイズはユーザーのサイズに依存せず、ユーザーのサイズに依存しないポインターのみを格納します。

役立つはずのもう1つの情報は、ヘッダーファイルに名前空間(あなたの場合はstd)を含めるのは悪い習慣だということです。「using」ステートメントを削除し、代わりに std::vector を実行する必要があります。他のコードにはソースが「インクルード」されないため、cpp ファイルで「using」を使用しても問題ありません。

于 2012-07-05T11:26:54.503 に答える
4

ヘッダーに循環依存関係があります。.cpp実装をファイルに移動し、使用するクラスを宣言することで修正できます。

#include <vector>
#include <string>

class Group; // forward declaration

class User{
    private :
        std::string username;
        std::vector<Group*> groups;
        void show();
};

#include <vector>
#include <string>

class User; // forward declaration

class Group{
    private :
        std::string name;
        std::string getName(){return name;};
        User *f;
        std::vector<User*> m;
        void show();
};

次に、実装ファイルにヘッダーを含めることができます。

using namespace stdまた、ヘッダーや大きなスコープでの使用を避ける必要があることに注意してください。

于 2012-07-05T11:24:18.747 に答える
2

テンプレートを使用していますvectorテンプレートであるを使用しています。

コードの次の部分に到達したときに User クラスが定義されていないため、エラーが発生しています。

User *f;
vector<User*> m;

User.h ヘッダーをインクルードしているのに、定義されていないのはなぜですか? はい。ただし、User.h ヘッダーには Group.h ヘッダーも含まれているため、2 つのうちの 1 つを他の前に読み取る必要があります。

これを修正するには、ヘッダーを変更して、ヘッダーの 1 つだけに他のヘッダーが含まれるようにする必要があります (または、両方に他のヘッダーが含まれないようにします)。これを行うには、まずメソッド定義を C++ ファイルに移動して、他のクラスのメソッドへのメソッド呼び出しがヘッダーに表示されないようにする必要があります。次に、他のクラスを前方宣言し、#include を削除できます。

于 2012-07-05T11:26:05.280 に答える