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
。但是我对class
Foo
在class
A
之外的任何地方都没有用处。我宁愿不要这个
#包括“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仅在创建它的对象中使用,则不存在所有权问题。