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

您正在重新声明string命名的分类。您只需在类声明中声明该变量一次,即可在所有成员函数中使用它。您还为您的论点使用相同的名称,这令人困惑和危险。

您还应该小心您在这里使用指针所做的事情,似乎您不确定何时使用它们或使用引用。如果您确实尝试string* classification像这样比较您的论点if (classification == "triangle" ),您会意识到您无法将std::string* 与 const char*进行比较

理想情况下,您应该在这里使用枚举,就像这样。

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

在您的代码Shapes::area中,您不需要重新定义变量classificationtyped std::string,因为string *classification那里有一个参数。

您可以使用您的参数*classification == "circle",领先*是因为您将参数声明为指针类型。另一种选择是在 C++ 中声明classificationstring &classification这是一个引用。并且带有引用参数,可以直接使用 like 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 回答