Я знаю, что это часто задаваемый вопрос о C ++, но, следуя советам других ответов, я все еще не могу заставить работать свой, казалось бы, простой код. Моя проблема в следующем коде выдает «ошибка: переопределение« класса коммуникатора »»:
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() { ... }