【问题标题】:Can't access private class members inside of static method?无法访问静态方法内的私有类成员?
【发布时间】:2013-03-28 15:47:54
【问题描述】:

我有以下设置:

//.h
class Cell
{
private:
    POINT   mCellStartingPoint;
    int     mXoffset;
    int     mYoffset;
public:
    static void DrawRowOfPixels(int yoff);
    Cell();
    ~Cell();
};

//.cpp
void Cell::DrawRowOfPixels(int yoff)
{
    HDC dc = GetDC(NULL);
    COLORREF red = 0xFF0000;
    for(int i = mCellStartingPoint.x; i < mXoffset; i++)
    {
        SetPixel(dc, mCellStartingPoint.x + i, mCellStartingPoint + yoff, red);
    }
}

但是,在 .cpp 文件中实现 DrawRowOfPixels() 方法时,我在 Cell 类的所有成员变量中都遇到了错误。 (即 mCellStartingpoint、mXoffset 和 mYoffset)

错误 C2228:'.x' 左侧必须有类/结构/联合

错误 C2597:非法引用非静态成员 'Cell::mXoffset'

错误 C3867:“Cell::mXoffset”:函数调用缺少参数列表;使用 '&Cell::mXoffset' 创建指向成员的指针

错误:非静态成员引用必须相对于特定对象

我知道我可能正在做一些非常愚蠢的事情,但这里发生了什么?为什么我不能在我的静态成员函数中使用我的私有成员变量?

【问题讨论】:

  • 静态成员函数无法访问非静态数据成员是有逻辑的。它是静态成员函数定义的一部分。
  • 如果您有一个 object 与这些数据成员一起使用,可能会有很大帮助。您正在使用静态类函数。它没有对象,因此没有成员。使函数非静态,将对象作为参数传入,或使成员静态。以上任何一项都可以。选择适合您需要的。
  • 那么我真的无法访问它们吗?我认为静态函数的重点是能够在没有对象的情况下调用,但仍然具有与对象调用相同的用途。
  • @user2057387,如果它没有对象,它使用哪个对象的数据成员集?
  • 为什么这些事情只有在我在互联网上自欺欺人之后才有意义......

标签: c++ windows class methods static


【解决方案1】:

你不能在 static 方法中访问非静态成员,除非你在成员函数中显式地使对象实例可用。(显式地传递对象实例作为参数或使用可以在内部访问的全局实例函数)

对于非静态成员函数,隐式 this 指针作为第一个参数传递给函数。 this 指针在成员函数内部被取消引用以访问成员。 static 成员不使用隐式 this 指针传递,因此您无法访问函数内的非静态成员,除非您显式获取成员函数内的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多