0

これは C++ に関するよくある質問ですが、他の回答などのアドバイスに従っても、一見単純なコードを動作させることができません。私の問題は、次のコードで「エラー: 'class Communicator' の再定義」が発生することです。

グローバル.h

#ifndef GLOBAL_H 
#define GLOBAL_H

class object_payload;
class pending_frame;

class Communicator {
private:
    map<string,object_payload*> local_objects;
    map<string,pending_frame*> remote_tasks;
    bool listening;

public:
    Communicator();
    void stop_listening();
    void add_to_remote_tasks(string name, pending_frame* pfr);
    void listen();
    void distributed_release(string task_name);

};

extern Communicator communicator;

#endif

グローバル.cpp

#include "global.h"

class Communicator {

private:
    map<string,object_payload*> local_objects;
    map<string,pending_frame*> remote_tasks;

    bool listening;

public:

    Communicator(){
        // implementation
    }

    void stop_listening(){
        // implementation
    }

    void add_to_remote_tasks(string name, pending_frame* pfr){
        // implementation
    }

    void listen(){
        // implementation
    }

    void distributed_release(string task_name){
        // implementation
    }
};

Communicator communicator;

なぜこのエラーが発生するのか誰にもわかりますか? .cpp にはヘッダーが含まれています。ヘッダーも含む他の .cpp ファイルがありますが、ガードを使用すると、それが問題になる理由がわかりません。

これについてご協力いただきありがとうございます。

EDIT:また、私のrunner.cppファイル(メインを含む)には、コミュニケーターグローバルオブジェクトにアクセスするためにglobal.hが含まれています。

4

4 に答える 4

1

クラスの定義は 1 つだけである必要があります。現在、#include から 1 つを取得し、ファイル内で別のものを取得します。

クラス自体を繰り返さないでください。次のように、関数をクラス外に実装するだけです。

Communicator::Communicator(){
    // implementation
}
于 2013-06-19T15:12:18.693 に答える
0

cpp ファイルでは、宣言されているがヘッダーで定義されていない関数を定義し、それらをクラスにスコープするだけで済みます。

Communicator::Communicator(){
    // implementation
}

void Communicator::stop_listening(){
    // implementation
}

void Communicator::add_to_remote_tasks(string name, pending_frame* pfr){
    // implementation
}

void Communicator::listen(){
    // implementation
}

void Communicator::distributed_release(string task_name){
    // implementation
}
于 2013-06-19T15:12:27.123 に答える
0

ヘッダー ファイルでクラスを定義Communicatorし、.cpp ファイルでクラスを追加しようとします。C++ ではできません。クラス定義のすべての部分が同じ場所にある必要があります。

ヘッダー ファイルにはおそらくすべてのメンバー定義と関数宣言が含まれている必要があり、.cpp は次のようなメンバー関数の定義に進む必要があります。

void Communicator::stop_listening() { ... }
于 2013-06-19T15:12:28.280 に答える