c ++访问器mutators不读取cin switch case语句

时间:2016-10-31 05:27:57

标签: c++ while-loop switch-statement accessor mutators

我正在使用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终端执行此操作,我很难看到传入的值。

2 个答案:

答案 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 或两者兼而有之,这是一个品味问题。