Более короткие звонки / имена без использования Определяет - PullRequest
3 голосов
/ 16 июля 2010

Простой вопрос, как сократить вызов / имя без использования определений.

Например, у меня есть синглтон, который я должен вызвать, который находится в пространстве имен (я не могу использовать , используя пространство имен blabla , потому что это не разрешено), например так:

MyFW::GameRoot::Instance()->DoSomething();

Теперь я могу присвоить это переменной, которая работает несколько, если я использую ее несколько раз в одном и том же классе / функции, но используя ее во многих классах / функциях, это становится громоздким. Я решил использовать для этого #define:

#define MyFW::GameRoot::Instance() ROOT //defined in GameRoot.h

ROOT->DoSomething(); //Used where-ever GameRoot.h is included

Гораздо лучше, и мне действительно это нравится, особенно потому, что теперь, где бы я ни увидел ROOT (цветовое кодирование через V-Assist), я сразу же узнаю, что это такое ... если только у меня нет точки останова, и мне нужна Visual Studio для разрешения ROOT показать в окне просмотра (или даже навести на него курсор, чтобы быстро вывести объект в режиме отладки), чего он не может сделать.

Есть ли другой вариант? Что вы, ребята, делаете, чтобы сократить имена? Просто используйте локальные / членские указатели для хранения экземпляра?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 16 июля 2010

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

namespace root=MyFW::GameRoot;

Тогда вы можете набрать

root::Instance()->DoSomething();

Определение пространства имен, напримерэто лучше, чем #define.(То есть он не может быть спрятан в другом месте по ошибке. Компилятор знает, что вы пытаетесь сделать.)

5 голосов
/ 16 июля 2010

Использовать местные ссылки:

MyFW::GameRoot& ROOT = *MyFW::GameRoot::Instance();

Не использовать определения.

2 голосов
/ 16 июля 2010

Если вы хотите облегчить доступ к нескольким функциям, просто используйте вспомогательную функцию:

namespace {
    MyFW::GameRoot* root() { return MyFW::GameRoot::Instance(); }
}

// ...
root()->DoSomething();

Еще на два символа, но она поставляется с включенной безопасностью типов.

1 голос
/ 16 июля 2010

Хороший способ сделать это (но никогда в заголовке) - это

using MyFW::GameRoot;
GameRoot::Instance()->DoSomething;

Это с использованием объявления и отличается от используя директиву , о которой вы упомянули выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...