繁体   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