如何仅在 cpp 中定义私有成员函数

Posted

技术标签:

【中文标题】如何仅在 cpp 中定义私有成员函数【英文标题】:How to define a private member function only in cpp 【发布时间】:2021-12-28 16:30:18 【问题描述】:

所以考虑我有一个带有私有成员变量和私有函数的类,我不想在头文件中定义它,因为我想对用户“隐藏”它。

我怎样才能做到这一点?如果没有在标头中声明函数,我将无法访问私有变量。

那么有效的是这样的:

// header file
class Testclass  
  public:
    // ...
  private:
    const int m_i;
    void func() const;



// cpp file
#include "TestClass.h"

Testclass::func() const 
  int j = m_i; //access to a private member variable


// ...

但我想要这样的东西:

// header file
class Testclass 
  public:
    //...
  private:
    const int m_i;


// cpp file
#include "TestClass.h"

Testclass::func() const 
  int j = m_i; //access to a private member variable


// ...

我有哪些可能性?我读过一些关于 PIMPL 成语的东西,但我不确定这是否是我想要的,因为它看起来有点麻烦。

【问题讨论】:

成员函数,包括私有函数,是类定义的一部分。如果您不希望看到 Testclass 定义的代码甚至看到 Testclass::func 的签名,则需要额外的间接层,例如 Pimpl 习惯用法。 PIMPL 实现您想要的。如果对你的口味太繁琐,那就把私有成员放在头部。 class Testclass friend class HelperTestclass; ; 那么您可以使用 HelperTest 类作为悬挂所有非公共消费物品的地方。 谢谢大家!我以为我会错过一些基本的东西。如果必须的话,似乎 Pimpl 和朋友是最好的选择。 【参考方案1】:

通常通过PIMPL(指向实现的指针)习语来实现这一点。在您的头文件中,您有:

class MainClass

public:
    void public_function();
private:
    class Impl;
    Impl* impl;
;

注意头文件不包含Impl类的定义,只包含它的声明。

然后您在 cpp 文件中定义该类并将调用从您的公共接口转发到 impl 类的函数:

class MainClass::Impl

    void actualfunc()
    
        //do useful stuff here
    

;

void MainClass::public_function()

    return impl->actualfunc();

除了对类用户隐藏不需要的成员之外,PIMPL 习惯用法还提供了额外的好处,即如果不对类的接口进行任何更改,则无需重新编译类的用户。

【讨论】:

使用唯一指针。【参考方案2】:

您可以在 cpp 文件中包含非成员帮助函数,类成员可以使用这些函数。但是,他们必须将私有变量作为参数传递。

// header file
class Testclass 
  public:
    //...
  private:
    const int m_i;


// cpp file
#include "TestClass.h"

void func(int m_i) 
  int j = m_i; //private member variable supplied by caller


// ...

【讨论】:

以上是关于如何仅在 cpp 中定义私有成员函数的主要内容,如果未能解决你的问题,请参考以下文章

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

类的默认成员函数

如何通过定义派生类的构造函数来实例化两个基类的私有数据成员?

私有(private)成员

Friend函数访问静态库中定义的类的私有成员

在同一个类的另一个成员函数的定义中调用一个类成员函数