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

How to define a private member function only in cpp

所以考虑我有一个 class,它有一个私有成员变量和一个我不想在 header 文件中定义的私有函数,因为我想从用户。

我该怎么做?如果没有在 header.

中声明函数,我将无法访问私有变量

所以有效的是这样的:

// 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 Idiom 的内容,但我不确定这是否是我想要的,因为它看起来有点麻烦 coding-wise.

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

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

请注意,头文件不包含 Impl 的定义 class,仅包含其声明。

然后您在您的 cpp 文件中定义 class 并将来自您的 public 接口的调用转发给 impl class:

的函数
class MainClass::Impl
{
    void actualfunc()
    {
        //do useful stuff here
    }

};

void MainClass::public_function()
{
    return impl->actualfunc();
}

除了您打算向 class 用户隐藏不需要的成员外,PIMPL 习语还提供了额外的好处,即如果不对 class 的界面进行任何更改,则class不需要重新编译。

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

// 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
}

// ...