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

时间:2009-10-09 17:05:54

标签: c++ gcc g++

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

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

  1. 从非活动的块池中获取块
  2. 使用Chunk的私有成员变量/函数
  3. 从输入流填充Chunk实例
  4. 返回指向调用者的块的指针
  5. 但第2步给了我适合。无论我尝试过什么,尝试访问Chunk实例的私有成员变量/函数都会导致g ++ 4.2.1发出错误。

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

    class Chunk
    {
    public:
                            Chunk();
    ...
        static Chunk*       GetNextFilledChunk();
    ...
    
    private:
    ...
        ssize_t             m_ActualTextSize;
    };
    

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

    #include "Chunk.h"
    
    
    Chunk::
    Chunk*  GetNextFilledChunk()
    {
        ...
        theChunk = sInactiveChunks.top();
        sInactiveChunks.pop();
        ...
        theChunk->m_ActualTextSize = TextSize();    // PROBLEM IS HERE
        ...
    
        return theChunk;
    }
    

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

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

    friend static Chunk * GetNextFilledChunk();

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

    我觉得奇怪的是,如果我只是简单地将GetNextFilledChunk()变成一个普通的旧函数,而不是一个静态成员函数,我就可以“交朋友”,并且每个人都很开心。但这看起来很愚蠢 - 为什么一个人能够从一个无法通过静态成员函数完成的非类函数中在某个类中做某事?

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

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

5 个答案:

答案 0 :(得分:21)

这看起来有点离奇:

Chunk::
Chunk*  GetNextFilledChunk()
{
这是一个错字吗?应该是:

Chunk* Chunk::GetNextFilledChunk()
{

?看起来您不小心将GetNextFilledChunk定义为普通函数而不是Chunk的成员。

答案 1 :(得分:8)

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

正确的签名如下

Chunk*  
Chunk::GetNextFilledChunk() {
  ...
}

答案 2 :(得分:7)

您定义的成员函数错误。它应该这样定义:

Chunk * Chunk::GetNextFilledChunk()
{
    ...
}

定义恰好编译是由于语言的怪癖:类名被插入到他们自己的名称空间中,因此Chunk::Chunk等同于Chunk,所以你定义了一个全局函数不小心。

答案 3 :(得分:2)

首先,和其他人一样,功能定义是错误的。此外,不需要友元函数,也不需要访问说明符,因为您希望函数成为类的一部分,并且由于拼写错误,编译器显然不会这样做。

至于你的问题的直接答案:公共静态成员函数如何访问私有实例成员变量?

它不能;只有非静态成员函数才能访问静态和非静态变量,而静态成员函数只能访问静态成员变量。 原因:调用静态函数不需要对象实例化,因此没有这个指向静态成员函数的指针,因此,没有非静态成员要访问的变量。

答案 4 :(得分:0)

我认为单身模式非常适合这种情况。您可以访问任何类型的成员函数,而无需担心是否从静态函数访问它...