簡體   English   中英

分離到.h / .cpp后重新定義類

[英]Redefinition of Class after Separating to .h/.cpp

我知道這是一個關於C ++的常見問題,但是根據其他答案的建議,我仍然無法讓我看似簡單的代碼工作。 我的問題是以下代碼給出了“錯誤:重新定義'類Communicator'”:

global.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

global.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文件,也包括標題,但與警衛我不明白為什么這將重要。

感謝您對此的任何幫助,非常感謝。

編輯:此外,我的runner.cpp文件(與主)包括global.h,以訪問通信器全局對象。

您必須只有一個類的定義。 目前你從#include獲得一個,在文件中獲得另一個。

你不應該重復這個類本身,只是實現類外的函數,比如

Communicator::Communicator(){
    // implementation
}

那不是你如何進行分離。 class (即聲明)進入標題; CPP文件應該有方法實現,如下所示:

Communicator::Communicator() {
    ...
}
void Communicator::stop_listening() { 
    ...
}

等等。 請注意完全限定名稱的Communicator::部分:這是告訴編譯器您正在定義的函數屬於Communicator類的內容。

在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
}

您在頭文件中定義類Communicator ,然后嘗試在.cpp文件中添加它。 你不能在C ++中做到這一點 - 類定義的所有部分必須在同一個地方。

您的頭文件應該包含所有成員定義和函數聲明,並且.cpp應該繼續定義成員函數,如:

void Communicator::stop_listening() { ... }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM