2013-06-19 3 views
0

Я знаю, что это часто задаваемый вопрос о C++, но, следуя советам других ответов и т. Д., Я все еще не могу заставить мой, казалось бы, простой код работать. Моя проблема заключается в следующем коде дает "ошибка: переопределение 'класса Communicator'":Переопределение класса после разделения на .h/.cpp

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

Спасибо за любую помощь по этому поводу, очень ценится.

EDIT: Кроме того, мой файл runner.cpp (с основным) включает global.h для доступа к глобальному объекту коммуникатора.

+0

Ваш заголовок говорит «класс Communicator», ваш файл cpp говорит «class Communicator», и ваша ошибка говорит «переопределение« класса Communicator ». Это честно. – doctorlove

ответ

1

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

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

Communicator::Communicator(){ 
    // implementation 
} 
+0

Ах, да, я понимаю, как сейчас происходит разделение. Я благодарю вас и других (очень быстрых) участников. – ricky116

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 
} 
0

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

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

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

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

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

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

Смежные вопросы