Прямое объявление переменных / классов в пространстве имен std
Я обычно использую преимущественно прямое объявление, если у меня есть класс ,который не нуждается в полном определении.файл ГЭС
Ex)
//B.hpp
namespace A_file {
class A;
}
namespace B_file {
class B {
public:
B();
private:
A *ptr_to_A;
}
}
//B.cpp
#include "A.hpp"
using namespace A_file;
namespace B_file {
B(int value_) {
*ptr_to_A = new A(value_);
}
int some_func() {
ptr_to_A->some_func_in_A();
}
}
Я пишу такой код. Я думаю, это опять спасет в том числе и всю ГЭС. (Не стесняйтесь комментировать, если вы вещь, это не здорово)
Можно ли сделать то же самое для объектов / классов в пространстве имен std? Если есть способ, это нормально или у него есть побочные эффекты?
1 ответ:
Вы можете переадресовать объявление собственных классов в заголовочные файлы, чтобы сэкономить время компиляции. Но вы не можете для классов в пространстве имен std. В соответствии со стандартом C++11, 17.6.4.2.1:
Обратите внимание, что некоторые из этих классов являются typedefs шаблонных классов, поэтому простое прямое объявление не будет работать. Вы можете использоватьПоведение программы на языке C++ не определено, если она добавляет объявления или определения пространства имен std или пространства имен в пространстве имен std если не указано иное.
#include<iosfwd>
вместо#include<iostream>
, например, но нет подобных заголовков с только прямыми объявлениями дляstring
,vector
, и т.д.СмотритеGotW #34, Forward Declarations для получения дополнительной информации.