Я задаюсь вопросом о значении следующих строк кода в заголовок файл…
Во первых у меня стандарт using
что делает класс из пространства имен видимым для моего кода
using mynamespace::myclass;
и затем предварительное объявление того же класса:
namespace mynamespace
{
class myclass;
}
и, наконец, предварительное объявление другого класса:
class myclass2;
Каковы тонкие различия для программиста при «использовании» и когда «декларирование вперед»? Что является более предпочтительным при написании заголовок файл?
Ваш первый вариант недействителен. Вы можете только дать заявление об использовании после предварительная декларация
namespace N { class C; } // OK, now we know that N::C exists
using N::C; // OK, now we can type C whenever we mean N::C
В предварительной декларации вводится имя, в декларации использования вводится аббревиатура этого имени (то есть вы можете не указывать квалификацию пространства имен).
Неофициальная аналогия с именами и фамилиями: сначала будет представлен человек, и только потом вы получите имя по имени.
В качестве ориентира: никогда не помещайте использование-объявления в глобальную область видимости внутри заголовочных файлов. Это введет сокращение в каждую единицу перевода, которая включает этот заголовок, и может привести к конфликтам имен.
Для того, чтобы заранее объявить класс, вам не нужно using
директива, обычно лучше просто использовать полное имя в заголовке:
namespace mynamespace
{
class myclass;
}
class A{
mynamespace::myclass* ptr;
};
Также как Джрок отметил, что вы не можете использовать using
привести символ в текущую область видимости до фактического (прямого) объявления символа.
Единственная вещь using
делает — делает указанный символ доступным в текущей области видимости. Это не связано с направлением деклараций.
Обратите внимание, что указанный символ уже должен быть объявлен, поэтому, если вы используете оба, вам придется сначала объявить forward, а затем перенести его в текущую область. Пример:
namespace mynamespace {
class myclass;
}
namespace this_header_namespace {
using mynamespace::myclass;
}