我知道这是一个关于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文件(带有main)包含global.h,以便访问通信器全局对象。
答案 0 :(得分:1)
您必须只有一个类的定义。目前,您从#include获得一个,在文件中获得另一个。
你不应该重复这个类本身,只需要实现类外的函数,比如
Communicator::Communicator(){
// implementation
}
答案 1 :(得分:1)
这不是你如何进行分离。 class
(即声明)进入标题; CPP文件应该有方法实现,如下所示:
Communicator::Communicator() {
...
}
void Communicator::stop_listening() {
...
}
等等。请注意完全限定名称的Communicator::
部分:这是告诉编译器您正在定义的函数属于Communicator
类的内容。
答案 2 :(得分: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
}
答案 3 :(得分:0)
您在头文件中定义类Communicator
,然后尝试在.cpp文件中添加它。你不能在C ++中做到这一点 - 类定义的所有部分必须在同一个地方。
您的头文件应该包含所有成员定义和函数声明,并且您的.cpp应继续定义成员函数,如:
void Communicator::stop_listening() { ... }