Russian Qt Forum

Программирование => С/C++ => Тема начата: QDgara от Декабря 25, 2006, 12:33



Название: Вопрос по Namespace.
Отправлено: QDgara от Декабря 25, 2006, 12:33
Есть нестоклько неймспейсов Name1, Name2, Name3. Для каждого свой h файл и сpp файл. Вопрос в том: как в Name1 добавить Name2 и Name3?

добавлено спустя 32 минуты:

 Пока только нашёл вариант с перекрётным инклудом. В Name2.h и Name3.h добавляем #include <Name1.h> и помещаем неймспейсы в Name1.
А Name2.h и Name3.h инклудить надо в Name1.h

добавлено спустя 57 секунд:

 Мне почему-то этот способ не подуше, есть ещё варианты?


Название: Вопрос по Namespace.
Отправлено: Admin от Декабря 25, 2006, 12:40
ну можно так

using namespace NAME1

или так

NAME1::MethodAny


Название: Вопрос по Namespace.
Отправлено: QDgara от Декабря 25, 2006, 13:02
А где тут добавления одного неймспейса в другой? Я только вижу обьяление Name1 , как неймспейс по-умолчанию.


Название: Вопрос по Namespace.
Отправлено: Вудруф от Декабря 25, 2006, 13:06
Не понял вопроса...
Тебе что именно нужно? Вложенные namespace?
Код:

namespace Name1
{
  namespace Name2
  {
    //Some code
  }
}


Обращение к Name1 из Name2?
Код:

namespace Name2
{
  //...
  Name1::<some_object>;
}


Название: Вопрос по Namespace.
Отправлено: QDgara от Декабря 25, 2006, 16:40
Цитата: "Вудруф"
Не понял вопроса...
Тебе что именно нужно? Вложенные namespace?

Да. Именно вложенные namespace, но только чтоб каждый namespace в отдельном заголовочном файле определять. Это возможно?


Название: Вопрос по Namespace.
Отправлено: Вудруф от Декабря 25, 2006, 17:06
Зачем их определять в отдельном заголовочном файле? Они объявляются в месте использования, пусть даже и несколько раз...
1.h
Код:

namespace Name1
{
  namespace Name2
  {
    void some_func1 ();
  }
}

2.h
Код:

namespace Name1
{
  namespace Name2
  {
    void some_func2 ();
  }
}


Итого, когда мы подключим 1.h, мы будем видеть только первую функцию. Когда подключим оба файла - обе функции. Проблем это не вызовет.

Рассмотрим такой вариант:
1.h
Код:

namespace Name2
{
  void some_func1 ();
}

2.h
Код:

namespace Name1
{
  namespace Name2
  {
    void some_func2 ();
  }
}

В такой ситуации, подключив оба h-файла, Name2 будут различными. Один в Name1, другой - глобальный. Это можно обойти так:
Код:

namespace Name1
{
#include "1.h"
}
#include "2.h"

Но это уже изврат.

добавлено спустя 1 минуту:

 Суть-то тут в том, что namespace не является объектом. Это всего лишь средство разделения области видимости.