3

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

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());
        }
    }
}

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

4

2 回答 2

4

首先,由于函数是static,它无权访问view. 那是因为view是 的非静态成员Shapemaker,所以只与特定实例 o 相关联Shapemaker。要么view需要,static要么Create功能不应该。另一种选择是它view不应该是成员,应该在Create函数内部创建。

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

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

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

于 2013-03-28T20:04:56.143 回答
1

view是CDrawView类的一个非静态对象, Create是类的静态函数,如果不构造一个对象,ShapeMaker就不会有实例,而与ShapeMaker的任何对象都没有关联。您不能在静态成员函数中使用非静态成员。viewShapeMakerCreate

于 2013-03-28T20:10:05.853 回答