我正在使用Ubuntu终端g ++编译器,我很难调试
这是我的代码: S.H
class S
{
protected:
string name;
bool space;
public:
S();
S(string,bool);
void setName(string name);
string getName();
};
在我的S.cpp
中string S::getName()
{
return (name);
}
void S::setName(string name) // I tried to change to other variable names but gave me segmentation errors
{
name = name;
}
S::S() // default constructor
{
name = "";
space = true;
}
S::S(string name, bool space) // non-default constructor
{
name = name;
space= space;
}
我得到了另一个我要实现流程的课程 在我的Main.cpp
中 void Main::mainmenu()
{
//cout displays//
cout<<"Please input your choice: ";
cin>>choice;
option(choice);
}
void Main::option(int choice)
{
static string shapename;
static bool space;
const int size = 100;
static S s[size];
static int number =0;
static int count = 0;
while(choice !=999)
{
switch(choice)
{
case 1:
{
cout<<"Please enter name of Shape:";
cin>>shapename;
s[size].setName(shapename);
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
count++;
mainmenu();
cin>>number;
option(number);
}
break;
case 2:
{
for(int x = 0;x<count;x++)
{
cout<<count<<endl;
cout<<shapename<<endl; // this is to test if the string reaches case 2 and it displays the correct input
cout<<s[x].getName()<<endl; // however this method prints a blank.
}
mainmenu();
cin>>number;
option(number);
}
break;
default:break;
} // end of switch
} // end of while
}
我刚刚在mainmenu()
int main()
我正在尝试在我的main.cpp上做一个switch case,其中案例1我让用户输入他们想要的名字,我使用类S中的set方法获取名称,在我的情况下2,我想要使用get方法检索并打印出用户输入的名称。
我已经将静态放在了前面,因为我认为调用可能会影响这些值。
如何使用switch case语句检索我的get / set方法?我正在使用Ubuntu终端执行此操作,我很难看到传入的值。
答案 0 :(得分:1)
s[size].setName(shapename);
始终写入同一位置,并且它位于阵列之外。很确定你想要
s[count].setName(shapename);
一旦你解决了这个问题,就可以在setName
中处理名称阴影错误,而不会触发段错误。
非主题:
所有这些静态变量应该是类成员变量。
递归在while
循环中不是一个好的选择。两者都试图达到同样的目标。
答案 1 :(得分:1)
让我们看看这是否对你有所帮助。
考虑一下:
void S::setName(string name)
{
name = name;
}
您在这里做的是使用 name 的值初始化变量 name ,也就是说您正在设置 name &#39;自己的价值。
这称为变量阴影。
为避免这种情况,最佳做法是为私人数据成员添加前缀,例如
class S
{
protected:
string _name;
bool _space;
...
};
所以,例如,你的setter将是
void S::setName(string name)
{
_name = name;
}
另一种方法是使用 this 显式访问您的成员,如下所示
void S::setName(string name)
{
this->name = name;
}
如果您想为数据成员添加前缀,请使用 this 或两者兼而有之,这是一个品味问题。