【问题标题】:error:a nonstatic member reference must be relative to a specific object错误:非静态成员引用必须相对于特定对象
【发布时间】:2013-03-19 10:31:34
【问题描述】:

我不明白为什么视图给我一个非静态成员引用必须是相对于特定对象的错误。

CDrawView::Shape 是我在CDrawView 上声明的枚举

enum shape{line, rect, elli};
shape current_shape;

这是我的另一门课

class Shapemaker
{
public:

    CDrawView view;
    static void Create(CDrawView::shape )
    {
        if(view.current_shape == view.line)
        {
            view.m_shape.reset(new Line());
        }
        else if(view.current_shape == view.rect)
        {
            view.m_shape.reset(new Rect());
        }
    }
}

避免此错误的最佳做法是什么

【问题讨论】:

  • 你需要了解静态成员和非静态成员的区别。基本解决方案是 (a) 使您的成员函数非静态,或 (b) 使您的成员变量静态。

标签: c++ static enums


【解决方案1】:

首先,由于函数是static,所以它无权访问view。那是因为viewShapemaker 的一个非静态成员,所以只与特定实例o Shapemaker 相关联。 view 必须是 static 或者 Create 函数不应该是。另一种选择是 view 不应该是成员,应该在 Create 函数中创建。

此外,枚举常量的名称在 CDrawView 类的范围内,可以通过类名访问,如下所示:

if(view.current_shape == CDrawView::line)

. 运算符用于访问对象的非静态成员。 view 没有名为 linerect 的非静态成员。

【讨论】:

    【解决方案2】:

    view是CDrawView类的非静态对象,CreateShapeMaker类的静态函数,如果不构造ShapeMaker的对象,则不会有view的实例,而@ 987654326@ 不与 ShapeMaker 的任何对象关联。不能在静态成员函数中使用非静态成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-13
      • 2021-05-30
      • 2018-10-23
      • 2015-06-01
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多