代码之家  ›  专栏  ›  技术社区  ›  Bob Murphy

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

  •  8
  • Bob Murphy  · 技术社区  · 15 年前

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

    我希望调用者能够调用一个名为 GetNextFilledChunk()。 哪一个

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

    但第二步是让我适应。无论我做了什么尝试,尝试访问块实例的私有成员变量/函数都会导致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()试图访问块的私有成员。

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

    friend static chunk*getNextFilledChunk();

    “chunk.h:23:警告:chunk*getNextFilledChunk()声明了226;静态但从未定义”

    我发现真正奇怪的是,如果我只是简单地将getNextFilledChunk()变成一个普通的旧函数,而不是一个静态成员函数,我就可以“交友”它,并且每个人都很高兴。但这似乎很愚蠢——为什么一个人能够从一个非类函数中做一些不能从静态成员函数中做的事情呢?

    所以…chunk的getNextFilledChunk()函数如何访问chunk实例的私有成员变量?

    如果不能做到这一点,它是C++的固有部分,还是G++中的一个bug?

    5 回复  |  直到 15 年前
        1
  •  21
  •   RichieHindle    15 年前

    这看起来有点奇怪:

    Chunk::
    Chunk*  GetNextFilledChunk()
    {
    

    是打字错误吗?应该是:

    Chunk* Chunk::GetNextFilledChunk()
    {
    

    ?看起来你是无意中定义的 GetNextFilledChunk 成为一个普通函数而不是 Chunk .

        2
  •  8
  •   JaredPar    15 年前

    问题在您对getNextFilledChunk的定义中。在cpp文件中,您声明了一个非成员函数,该函数前面有一个格式错误的标签。它不会与头中的成员函数对齐。

    正确的签名如下

    Chunk*  
    Chunk::GetNextFilledChunk() {
      ...
    }
    
        3
  •  7
  •   Adam Rosenfield    15 年前

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

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

    定义编译得很好是由于语言的一个奇怪之处:类名被插入到自己的名称空间中,所以 Chunk::Chunk 等于 Chunk ,所以您意外地定义了一个全局函数。

        4
  •  2
  •   legends2k    15 年前

    首先,和其他人提到的一样,函数定义是错误的。另外,这里不需要友元函数,也不需要访问说明符,因为您希望函数是类的一部分,显然编译器不会因为输入错误而接受它。

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

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

        5
  •  0
  •   VNarasimhaM    15 年前

    我认为单体模式非常适合这个。您可以访问任何类型的成员函数,而不必担心是否从静态函数访问它…