0

CDrawViewクラスに次の列挙型宣言があります。

enum shape{line, rect, elli};

Shapemaker と呼ばれる私の他のクラスには、CDrawViewクラスから列挙型を取り込んで評価する関数があります。

  Shape* Shapemaker::shapeCreate(CDrawView::shape)
 {
  if(CDrawView::shape.line == 0)
    return new Line();

  else if(CDrawView::shape.rect == 1)
    return new Rect();

  else if (CDrawView::shape.ellip == 2)
    return new Ellip();
 }

whereShapemaker::shapeCreate(current_shape)current_shapeの単なるインスタンスですenum shape

  shape current_shape;

これにより、コンパイルエラーが発生します。

error C2653: 'CDrawView' : is not a class or namespace name
Shapemaker.h(7): 

これが列挙型と関数を使用したり、列挙型を比較したりする正しい方法であるかどうかは完全にはわかりません。

error C2061: syntax error : identifier 'shape'
'Shapemaker::shapeCreate' : function does not take 1 arguments

CDrawView.h

class CDrawView : public CScrollWindowImpl<CDrawView>
{
  public:

   CDrawView();
   enum shape{line, rect, elli};
       shape current_shape;
       //...
};

ファイル定義Shapemaker::shapeCreate()#include "CDrawView.h"一番上にあります。

4

1 に答える 1

5

CDrawView::lineの代わりに使用しCDrawView::shape.lineます。

CDrawView::shape、変数の宣言など、タイプが必要な場合にのみ使用されます。

A::shape var = A::line;

また、以下のコードは無意味です

Shape* Shapemaker::shapeCreate(CDrawView::shape)
{
    if(CDrawView::shape.line == 0)
        return new Line();

    else if(CDrawView::shape.rect == 1)
        return new Rect();

    else if (CDrawView::shape.ellip == 2)
        return new Ellip();
}

に変更します

Shape* Shapemaker::shapeCreate(CDrawView::shape s)
{
    if(s == CDrawView::line)
        return new Line();

    else if(s == CDrawView::rect)
        return new Rect();

    else if (s == CDrawView::ellip)
        return new Ellip();
}

または、使用するように変更することをお勧めしますswitch case

元のコードには多くの問題があります

  1. 関数パラメーターの変数名がありません。変数に名前を付けるように変更しましたs
  2. CDrawView::lineは定数です。常に 0 になります。したがって、常に が返されtrueます。関数は常に を返しnew Line()ます。
  3. ifの s も 2 つの定数を比較しておりtrue、それらに到達したことがある場合にも返されますが、そうではありません。
于 2013-03-29T04:49:05.163 に答える