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

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

  • 从不事件的块池中抓取一块
  • 使用Chunk的私有(private)成员变量/函数
  • 从输入流填充Chunk实例
  • 返回指向调用方
  • 的块的指针

    但是第2步很合适。无论我尝试了什么,尝试进入Chunk实例的私有(private)成员变量/函数都会导致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的私有(private)成员。

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

    friend 静态Chunk * GetNextFilledChunk();

    结果为“Chunk.h:23:警告:“Chunk * GetNextFilledChunk()”已声明为“静态”,但从未定义”

    我真正感到奇怪的是,如果我只是简单地使GetNextFilledChunk()成为一个普通的旧函数,而不是一个静态成员函数,我就可以与它“交 friend ”,并且每个人都很高兴。但这似乎很愚蠢-为什么人们应该能够通过非类函数在类中执行某些操作,而该类不能通过静态成员函数完成?

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

    而且如果无法完成,这是C++的固有组成部分,还是g++中的一个bug?

    最佳答案

    这看起来有些奇怪:

    Chunk::
    Chunk*  GetNextFilledChunk()
    {
    

    那是错字吗?应该是:
    Chunk* Chunk::GetNextFilledChunk()
    {
    

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

    关于C++:公共(public)静态成员函数如何访问私有(private)实例成员变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1544991/

    10-11 23:14
    查看更多