分离到.h/.cpp后类的重新定义
Redefinition of Class after Separating to .h/.cpp
我知道这是一个关于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() { ... }
相关文章:
- 定义C++新的环境变量并在 bat 文件中使用它
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 从使用概念定义的函数返回新对象
- 如何在C++中为 if 和 else 语句定义新行为
- 如何从 C++ 中的现有模板函数定义新函数
- 自定义分配器,包括放置新案例
- 正在通过const-ref未定义的行为捕获新构造的对象
- 如何在CPropertySheet中定义新颜色
- 谁定义新操作员
- 未定义的符号'fixed_address_empty_string':带有protobuf的新张量流运算
- 新的C ,未定义的参考
- boost :: fibonacci_heap:带有比较器重新定义圆形定义错误的嵌套定义
- 宏,用于定义带有添加前缀的新宏
- 取消脱壳:使用模板在多行类型定义中添加一个尖括号后的新行
- C 通过Typedef定义新类型
- 通过在此指针上放置新位置重新初始化对象时未定义的行为
- 在 ss.clear() 之后使用 ss.str( " ") 用于新定义的字符串流
- Eclipse CDT将方法定义定义到标头文件
- 是标头文件中使用“新”定义的成员指针泄漏
- LEX 程序中的未定义定义