2013-07-15 3 views
0

У меня есть одноэлементный класс, называемый Master. У этого класса есть другие объекты, которые выполняют определенную работу. Класс Master имеет метод get для этих объектов.Глобальные встроенные функции

namespace Framework { 
    class Master { 
    private: 
     NetworkController * mNetworkController; 
     FileController * mFileController; 

     static Master * gInstance; 

    public: 
     static Master * getInstance(); 

     NetworkController * getNetworkController(); 
     FileController * getFileController(); 
    } 
} 

Я использую эти объекты allthoughout программы следующим образом:.

Framework::Master::getInstance() -> getNetworkController() 
Framework::Master::getInstance() -> getFileController() 

Как вы можете видеть, это немного долго и отнимает много времени, чтобы набрать Так что я попытался положить их в макрос, например:

#define NETWORK_CONTROLLER() Framework::Master::getInstance() -> getNetworkController() 
#define FILE_CONTROLLER() Framework::Master::getInstance() -> getFileController() 

namespace Framework { 
    class Master { 
     ... 
    } 
} 

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

#ifndef __FrameworkHelper__ 
#define __FrameworkHelper__ 

inline Framework::NetworkController * MasterNetworkController() { return Framework::Master::getInstance() -> getNetworkController(); } 
inline Framework::FileController * MasterFileController() { return Framework::Master::getInstance() -> getFileController(); } 

#endif 

Но он дал мне ошибку компиляции при попытке использовать их на другой класс поговорке:

error C2653: 'Framework' : is not a class or namespace name 

Я не знаю, почему она выдаст ошибку, как это. Как я могу сделать эти встроенные методы доступными по всей моей программе?

+3

Вам нужно будет опубликовать больше кода заголовка, в котором вы указали 'inline', чтобы показать, где находится проблема. –

+3

Синглтоны вызывают всевозможные неприятности, не так ли? – doctorlove

+0

@NicholasSmith Я обновил вопрос. – alxcyl

ответ

3

Там нет упоминания о namespace framework в файле заголовка, вы можете это исправить, выполнив:

#ifndef __FrameworkHelper__ 
#define __FrameworkHelper__ 

#include "Framework.h" // where the framework is defined 

inline Framework::NetworkController * MasterNetworkController() { return Framework::Master::getInstance() -> getNetworkController(); } 
inline Framework::FileController * MasterFileController() { return Framework::Master::getInstance() -> getFileController(); } 

#endif 

или в заголовке рамочным:

#ifndef __Framework__ 
#define __Framework__ 

namespace Framework { 
    class Master { 
     ... 
    } 
} 

inline Framework::NetworkController * MasterNetworkController() { return Framework::Master::getInstance() -> getNetworkController(); } 
inline Framework::FileController * MasterFileController() { return Framework::Master::getInstance() -> getFileController(); } 

#endif 

Но я предпочитаю первое решение. ...

Другим решением, вместо использования методов inline, было бы установить getNetworkController и getFileControllerstatic и использовать их любят:

Master::getNetworkController(); 
Master::getFileController(); 

По моему мнению, было бы легче понять.

+0

У меня возникли проблемы с файлами заголовков при использовании метода 1. Поэтому я добавил inline определение ниже определения класса «Мастер», и казалось, что он работает нормально. Спасибо за ответ. – alxcyl

0

Quicker: установить ваши getNetworkController и getFileController методы static, а также getInstance, и реализовать их так:

NetworkController * getNetworkController() { 
    return Master::getInstance()->mNetworkController; 
} 

Вы можете даже установить ваш mFileController и mNetworkController статическими, так как Master одноэлементно.

Чтобы решить вашу проблему по своему усмотрению, вам нужно включить заголовок, содержащий определение пространства имен в заголовке FrameworkHelper (однако, обратите внимание на кросс-включение).

0

Возможно, это не вопрос, но я бы рекомендовал вам не использовать этот «Framework :: Master :: getInstance() -> ...» персонал вообще.

Ваш клиентский код не должен знать, что это экземпляр singleton или местный временный заглушка (например, для целей тестирования или для отмены моментальных снимков истории). Таким образом, единственное место, где вы должны набирать этот долговременный помощник, - это код инициализации модуля (поэтому вы просто добавляете ссылку в него, а затем забываете о «Framework :: Master :: getInstance() -> ...». это с помощью локально-запоминающейся ссылки.

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