Переопределение класса после разделения на .h / .cpp

Я знаю, что это часто задаваемый вопрос о 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 для доступа к глобальному объекту коммуникатора.

0

Решение

У вас должно быть только одно определение класса. В настоящее время вы получаете одно из #include и другое в файле.

Вы не должны повторять сам класс, просто реализуйте функции вне класса, как

Communicator::Communicator(){
// implementation
}
1

Другие решения

Это не то, как вы делаете разделение. class (то есть декларация) идет в заголовок; файл CPP должен иметь реализации методов, например:

Communicator::Communicator() {
...
}
void Communicator::stop_listening() {
...
}

и так далее. Обратите внимание Communicator:: часть полного имени: это то, что говорит компилятору, что определяемая вами функция принадлежит Communicator учебный класс.

1

В вашем файле 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
}
0

Вы определяете класс Communicator в заголовочном файле, а затем попробуйте добавить к нему в файле .cpp. Вы не можете сделать это в C ++ — все части определения класса должны быть в одном месте.

Ваш заголовочный файл, вероятно, должен содержать все определения членов и объявления функций, а ваш .cpp должен перейти к определению функций-членов, таких как:

void Communicator::stop_listening() { ... }
0
По вопросам рекламы [email protected]