如果我有一个不需要在 .hpp 文件中完整定义的类,我通常主要使用前向声明
例如)
//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();
}
}
我写了这样的代码。我想,它会再次保存整个 hpp。 (如果你觉得这不健康,请随意评论)
有没有一种方法可以对 std 命名空间中的对象/类执行相同的操作? 如果有办法的话可以吗还是有副作用吗?
您可以在头文件中转发声明自己的类以节省编译时间。但不能用于命名空间 std 中的类。根据C++11标准,17.6.4.2.1:
如果 C++ 程序添加声明或 命名空间 std 或命名空间 std 内的命名空间的定义 除非另有说明。
请注意,其中一些类是类模板的 typedef,因此简单的前向声明将不起作用。例如,您可以使用
#include<iosfwd>
代替 #include<iostream>
,但是没有类似的标头,只有 string
、vector
等的前向声明。
请参阅 GotW #34,前向声明 了解更多信息。