从类定义传递字符串指针

时间:2012-08-06 01:27:07

标签: c++ string

我遇到的问题是使用字符串参数。我不确定如何使用它。我只是希望分类从开始到用户输入时具有未定义的长度字符串。当我输入字符串分类时,我得到的错误是声明'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 个答案:

答案 0 :(得分: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
}

甚至 更好 ,而不是使用 inheritence 多态并重载{{1}等函数}

area()

答案 1 :(得分:1)

在您的代码Shapes::area中,您无需重新定义变量classification已键入std::string,因为您的某个参数string *classification存在。

您可以使用参数*classification == "circle",前导*是因为您将参数声明为指针类型。另一种方法是在C ++中将classification声明为string &classification,这是一个参考。使用参考参数,您可以直接使用classificaiton == "circle"

希望有所帮助。

答案 2 :(得分:0)

  

将字符串参数传递给类成员的正确方法是什么?

别。您已经可以访问类方法中的成员,不需要额外的变量,也不能将其作为参数传递。

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

在这种情况下,您有一个名为classification参数,名称相同的成员一个本地变量同名。

想想看,你甚至不需要指针。

您需要的是阅读C ++书籍。我不是讽刺也不是吝啬。 C ++很难做对,在你理解变量或范围的更基本概念之前,你似乎已经开始使用指针了。

答案 3 :(得分: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;
}

除非确实有必要,否则不要使用指向类的指针。如果要更改值,请使用引用。

P.S。不要在函数定义的末尾添加半冒号。