C++ 是否可以不在类头文件中包含类变量?
我想在实现文件中隐藏一个实现。如果对象不是公共的,我不希望对象的头在使用我的类的任何地方泄漏 假设我的类C++ 是否可以不在类头文件中包含类变量?,c++,C++,我想在实现文件中隐藏一个实现。如果对象不是公共的,我不希望对象的头在使用我的类的任何地方泄漏 假设我的类A有头文件A.h: #include "Foo.h" class A{ private: Foo foo; public: do_stuff(); }; 现在无论我在哪里包括A.h,Foo.h。但是我对classFoo在classA之外的任何地方都没有用处。我宁愿不要这个#包括“Foo.h”行。有没有办法在实现A.cpp中移动'foo'变量的
A
有头文件A.h
:
#include "Foo.h"
class A{
private:
Foo foo;
public:
do_stuff();
};
现在无论我在哪里包括A.h
,Foo.h
。但是我对classFoo
在classA
之外的任何地方都没有用处。我宁愿不要这个#包括“Foo.h”
行。有没有办法在实现A.cpp
中移动'foo'变量的声明
我怀疑一个可能的解决方案是添加一层抽象类(接口类比)。这是最好的解决方案吗
谢谢。使用指向Foo的指针并动态分配它,而不是使用成员对象。那么您只需要在A.cpp中包含Foo.h
class Foo;
class A{
private:
Foo* foo;
public:
do_stuff();
}
使用指向Foo的指针并动态分配它,而不是使用成员对象。那么您只需要在A.cpp中包含Foo.h
class Foo;
class A{
private:
Foo* foo;
public:
do_stuff();
}
大卫得到了正确的答案。我将参考这篇文章,对这种“不透明指针”技巧进行更详细的介绍,因为您可以根据自己的需要对其进行更详细的介绍:
此外,出于这个目的,最好使用共享的\u ptr类型,而不是像示例中那样的原始指针。一旦对Foo的最后一次引用超出范围,这将自动为您清理资源。David得到了正确的答案。我将参考这篇文章,对这种“不透明指针”技巧进行更详细的介绍,因为您可以根据自己的需要对其进行更详细的介绍:
此外,出于这个目的,最好使用共享的\u ptr类型,而不是像示例中那样的原始指针。一旦对Foo的最后一次引用超出范围,这将自动为您清理资源。是。选择你的毒药 备选案文1。在接口中转发声明
class A {
private:
class Foo;
Foo* foo;
};
备选案文2。美国广播公司
// A.hpp
class A {
public: virtual void do_stuff() = 0;
};
// A.cpp
class A_impl : public A {
class Foo { /*etc*/ };
Foo foo;
void do_stuff (){...}
};
备选案文3。私密就是私密。就公共API而言,它是“隐藏的”,这才是最重要的:
class A {
private:
class Foo {
...
};
private_::Foo foo;
public:
do_stuff();
};
备选案文4。只需将声明放在一个“非公共”名称空间中。即,从文档中省略它,并将其命名为某种东西以吓跑窥探者的眼睛:
namespace private_ {
class Foo {
...
};
}
class A {
private:
private_::Foo foo;
public:
do_stuff();
};
对。选择你的毒药 备选案文1。在接口中转发声明
class A {
private:
class Foo;
Foo* foo;
};
备选案文2。美国广播公司
// A.hpp
class A {
public: virtual void do_stuff() = 0;
};
// A.cpp
class A_impl : public A {
class Foo { /*etc*/ };
Foo foo;
void do_stuff (){...}
};
备选案文3。私密就是私密。就公共API而言,它是“隐藏的”,这才是最重要的:
class A {
private:
class Foo {
...
};
private_::Foo foo;
public:
do_stuff();
};
备选案文4。只需将声明放在一个“非公共”名称空间中。即,从文档中省略它,并将其命名为某种东西以吓跑窥探者的眼睛:
namespace private_ {
class Foo {
...
};
}
class A {
private:
private_::Foo foo;
public:
do_stuff();
};
+答案是1,greyfade是+1,指出它基本上是一个pimpl(指向私有实现细节的不透明指针)。很好!非常感谢。我记得看到过这个习惯用法,但当时我没有注意到它。+1表示答案,+1表示greyfade表示它基本上是一个pimpl(指向私有实现细节的不透明指针)。很好!非常感谢。我记得看到过这个成语,但当时我没有注意到它。我是共享指针的粉丝,但我认为在这种情况下,它太过分了。它通常在所有权复杂时使用。如果foo只在创建它的对象中使用,那么就没有所有权问题。我是共享指针的粉丝,但我认为在这种情况下使用它太过分了。它通常在所有权复杂时使用。如果foo仅在创建它的对象中使用,则不存在所有权问题。