分离到.h/.cpp后类的重新定义

Redefinition of Class after Separating to .h/.cpp

本文关键字:新定义 定义 cpp 分离      更新时间:2023-10-16

我知道这是一个关于c++的常见问题,但根据其他答案的建议,我仍然无法让我看似简单的代码工作。我的问题是下面的代码给出了"error: redefinition of 'class 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文件(与main一起)包含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() { ... }