我遇到的问题是使用字符串参数。我不确定如何使用它。我只是希望分类从开始到用户输入时具有未定义的长度字符串。当我输入字符串分类时,我得到的错误是声明'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" )
{
}
};
答案 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。不要在函数定义的末尾添加半冒号。