0

私が抱えている問題は、文字列パラメーターにあります。使い方がよくわかりません。ユーザーが入力するまで、分類の長さが未定義の文字列を持つようにしたいだけです。私が得ているエラーは、文字列分類を入力すると、「std::string classification」の宣言がパラメーターをシャドウすることです。文字列引数をクラス メンバーに渡す正しい方法は何ですか?


#include <iostream>
#include <string>
#include <iomanip>

using namespace std;


class Shapes 
{ //Begin Class Definition
      private:


       float side;
       float height;
       int exponent;
       string *classification;




      public:

             Shapes(float side, float height, string * classification);
             //CONSTRUCTOR
             ~Shapes(){};
             //DESTRUCTOR

      float area(float side, float height, string *classification);
      float perimeter(float side, float height, string *classification);




}; // End Class Definition



int power(float side, int exponent)

{
     int i;
     int total[exponent];
     float sum;

     for ( i = 0 ; i < exponent ; i ++ )
     {
      total[i]= side;
      sum *= total[i] ;

     }

     return sum;

}


float Shapes::area(float side, float height, string *classification)

{
     float area=0.0;
    string classification;
     getline(cin,string);

    if (classification == "square" ) 
    {

              area = power(side,2);
              return area;


    } 

      if (classification == "triangle" ) 
    {
         area = (side* height) / 2 ;
         return area;

    } 

      if (classification == "hexagon" ) 
    {
         float constant = 2.598706;

         area= constant * power(side,2);
         return area;

    } 


      if (classification == "circle" ) 
    {

    } 

};
4

4 に答える 4

2

名前付き分類を再宣言しています。すべてのメンバー関数で使用するには、クラス宣言でその変数を 1 回宣言するだけです。引数にも同じ名前を使用していますが、これは紛らわしく危険です。string

ここでポインターを使用して何をしているのかにも注意する必要があります。それらをいつ使用するか、または参照を使用するかが正確にわからないようです。実際にstring* classificationこのように引数を比較しようとすると、 std::string* を const char*if (classification == "triangle" )と比較できないことに気付くでしょう。

理想的には、ここで列挙型を使用する必要があります。

class Shape
{
  public:
    enum Classification { SQUARE, TRIANGLE, CIRCLE };
}

Shape::Area(float side, float height, Classification shapeClass)
{
  if(shapeClass == SQUARE) {} // Etc
}

継承ポリモーフィズムを使用し、次のようなオーバーロード関数を使用するよりもさらに優れていますarea()

class Shape { virtual float Area(); };
class Triangle : public Shape { virtual float Area(); };
于 2012-08-06T02:44:34.993 に答える
1

コードでは、パラメータの1つが存在するため、型指定されShapes::areaた変数を再定義する必要はありません。classificationstd::stringstring *classification

パラメータを使用できます。*classification == "circle"先頭*は、パラメータをポインタ型として宣言しているためです。別の方法は、参照であるC++のclassificationように宣言することです。string &classificationまた、参照パラメータを使用すると、のように直接使用できますclassificaiton == "circle"

お役に立てば幸いです。

于 2012-08-06T01:45:53.993 に答える
0

文字列引数をクラスメンバーに渡す正しい方法は何ですか?

しないでください。クラスのメソッド内のメンバーに既にアクセスできます。追加の変数は必要ありません。また、パラメーターとして渡す必要もありません。

float Shapes::area(float side, float height, string *classification)
{
    string classification;

この場合、と呼ばれるパラメーターclassification、同じ名前のメンバー、および同じ名前のローカル変数があります。

考えてみると、ポインタすら必要ありません。

必要なのは、C++の本を読むことです。私は皮肉でも意地悪でもありません。C ++を正しく理解するのは困難であり、変数またはスコープのさらに基本的な概念を理解する前に、ポインターの操作を開始したようです。

于 2012-08-06T01:43:11.257 に答える
0

クラスメンバーと同じパラメーター名を持っています。それらは同じ変数ではありません。

クラス メンバーをパラメーターのシャドウ コピーにしたい場合は、次のようにする必要があります。

float Shapes::area(float side, float height, string classification)
{
     float area=0.0;
     this->classification = classification;
     getline(cin,classification);

     //rest goes here
}

ここでthisは、ホルダー クラスへのポインターです。

クラス宣言を変更する必要があります。

class Shapes
{
    string classification;
}

本当に必要でない限り、クラスへのポインターを使用しないでください。値を変更する場合は参照を使用してください。

PS 関数定義の最後にセミコロンを入れないでください。

于 2012-08-06T02:00:18.867 に答える