类的用户不需要看到该类的私有成员。这些成员可能会引入用户不应该知道的新类型,需要#include文件来声明这些类型。我想去掉这些#include。我更喜欢在一个单独的.hpp文件中声明类的私有成员,这个文件只有类的实现才能看到。有办法做到这一点吗?我担心这是不可能的,因为客户端类可能需要知道该类示例的大小,然后才能访问它的完整声明,这不幸地增加了无用的依赖关系。
trnvg8h31#
您通常会使用pimpl idiom来执行此操作:
// -------------------- // interface (widget.h) class widget { widget(); void exampleFunction(); private: struct impl; std::unique_ptr<impl> pImpl; }; // --------------------------- // implementation (widget.cpp) struct widget::impl { // implementation details int exampleMember; }; widget::widget() : pImpl(std::make_unique<widget::impl>()){} void widget::exampleFunction() { pImpl->exampleMember++; }
vvppvyoh2#
简单的模式是这样的。
// IFoo.h #pragma once class IFoo { public: virtual void DoSomethingImportant() = 0; virtual void DoSomethingElse() = 0; }; ----------------------- // Foo.h #pragma once #include "IFoo.h" #include "MessyHeaderFilesThatPullIntooMuch.h" class Foo : public IFoo { private: ComplexStructure _internals; // stuff you don't want clients to know abouve int _x; int _y; public: virtual void DoSomethingImportant() override; virtual void DoSomethingElse() override; }; ----------------------- // Foo.cpp #include "Foo.h" void Foo::DoSomethingImportant() {Your code goes here} void Foo::DoSomethingElse() {Your code goes here} ----------------------- // FooFactory.h #pragma once #include <IFoo.h> IFoo* CreateFoo(); ----------------------- // FooFactory.cpp #include <FooFactory.h> #include <Foo.h> IFoo* CreateFoo() { return new Foo(); }
然后,想要获取“Foo”示例的客户端只需要#include "FooFactory.h",通过IFoo接口指针获取一个新的Foo示例,而且他们永远不需要看到Foo混乱的内部结构,也不需要依赖Foo需要的额外头文件,他们只需要返回隐藏了所有内部结构的Foo公共接口。
#include "FooFactory.h"
2条答案
按热度按时间trnvg8h31#
您通常会使用pimpl idiom来执行此操作:
vvppvyoh2#
简单的模式是这样的。
然后,想要获取“Foo”示例的客户端只需要
#include "FooFactory.h"
,通过IFoo接口指针获取一个新的Foo示例,而且他们永远不需要看到Foo混乱的内部结构,也不需要依赖Foo需要的额外头文件,他们只需要返回隐藏了所有内部结构的Foo公共接口。