C++:公共静态成员函数如何访问私有实例成员变量?

Bob*_*phy 8 c++ gcc g++

我正在编写一个C++类来读取文件中的输入到称为"块"的预分配缓冲区.

我希望调用者能够调用名为GetNextFilledChunk()的公共静态Chunk类方法,该方法

  1. 从非活动的块池中获取块
  2. 使用Chunk的私有成员变量/函数从输入流填充Chunk实例
  3. 返回指向调用者的Chunk的指针

但第2步给了我适合.无论我尝试过什么,尝试访问Chunk实例的私有成员变量/函数会导致g ++ 4.2.1发出错误.

这是头文件中的一个类定义:

class Chunk
{
public:
                        Chunk();
...
    static Chunk*       GetNextFilledChunk();
...

private:
...
    ssize_t             m_ActualTextSize;
};
Run Code Online (Sandbox Code Playgroud)

以下是显示问题的源文件的一部分:

#include "Chunk.h"


Chunk::
Chunk*  GetNextFilledChunk()
{
    ...
    theChunk = sInactiveChunks.top();
    sInactiveChunks.pop();
    ...
    theChunk->m_ActualTextSize = TextSize();    // PROBLEM IS HERE
    ...

    return theChunk;
}
Run Code Online (Sandbox Code Playgroud)

如图所示,g ++抱怨GetNextFilledChunk()正在尝试访问Chunk的私有成员.

然后我想,也许它需要成为一个"朋友".但是我在头文件中尝试做的所有事情都让GetNextFilledChunk()成为朋友会导致错误.例如:

friend static Chunk*GetNextFilledChunk();

导致"Chunk.h:23:警告:'Chunk*GetNextFilledChunk()'声明为'静态'但从未定义"

我觉得真正奇怪的是,如果我只是让GetNextFilledChunk()一个普通的老功能,而不是一个静态成员函数,我可以"朋友",它和每个人都是幸福的.但这看起来很愚蠢 - 为什么一个人能够从一个无法通过静态成员函数完成的非类函数中在某个类中执行某些操作?

那么...... Chunk的GetNextFilledChunk()函数如何访问Chunk实例的私有成员变量?

如果它无法完成,它是C++的固有部分,还是仅仅是g ++中的错误?

Ric*_*dle 21

这看起来有点离奇:

Chunk::
Chunk*  GetNextFilledChunk()
{
Run Code Online (Sandbox Code Playgroud)

那是一个错字吗?应该是:

Chunk* Chunk::GetNextFilledChunk()
{
Run Code Online (Sandbox Code Playgroud)

?看起来你不小心定义GetNextFilledChunk为普通函数而不是成员Chunk.

  • 我们都去过那儿 (11认同)

Jar*_*Par 8

问题在于您对GetNextFilledChunk的定义.如在CPP文件中所写,您已声明一个非成员函数,其前面是格式错误的标签.它不会与标题中的成员函数对齐.

正确的签名如下

Chunk*  
Chunk::GetNextFilledChunk() {
  ...
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 7

你定义你的成员函数是错误的.它应该像这样定义:

Chunk * Chunk::GetNextFilledChunk()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

该定义恰好编译好是由于语言的怪癖:类名被插入到他们自己的名称空间中,所以Chunk::Chunk相当于Chunk,所以你偶然定义了一个全局函数.