c++ 有没有办法对类的客户隐藏类的私有成员?

rsaldnfx  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(127)

类的用户不需要看到该类的私有成员。这些成员可能会引入用户不应该知道的新类型,需要#include文件来声明这些类型。我想去掉这些#include。我更喜欢在一个单独的.hpp文件中声明类的私有成员,这个文件只有类的实现才能看到。有办法做到这一点吗?
我担心这是不可能的,因为客户端类可能需要知道该类示例的大小,然后才能访问它的完整声明,这不幸地增加了无用的依赖关系。

trnvg8h3

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++;
}
vvppvyoh

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公共接口。

相关问题