C++ Can';t在类内第二次设置字符串类型

C++ Can';t在类内第二次设置字符串类型,c++,string,class,C++,String,Class,我有课 class Item { private: string name; public: void set_data() { getline(cin, name); } } 在main函数中,我设置了一次名称的值,但是当我想给它另一个值时,我不能。我的意思是,第二次从同一个对象调用函数时,它什么也不做。 首先,C++中的实现应该与声明分开,除非您使用的模板不是您所使用的模板。这不是Ja

我有课

class Item
{
    private:
        string name;

    public:
        void set_data()
        {
            getline(cin, name);
        }
}

在main函数中,我设置了一次名称的值,但是当我想给它另一个值时,我不能。我的意思是,第二次从同一个对象调用函数时,它什么也不做。

首先,C++中的实现应该与声明分开,除非您使用的模板不是您所使用的模板。这不是Java

其次,示例代码缺少右大括号。我已经提交了一个编辑来添加它并改进您的代码格式

除此之外,以下实施对我来说很有效:

项目.h

class Item
{
private:
    std::string name;

public:    
    void set_data();
    void printName();
};
项目1.cpp

void Item::set_data()
{
    std::cout << "Type name and hit return: " << std::endl;
    getline(std::cin, name);
}

void Item::printName()
{
    std::cout << "Name is : " << name << std::endl;
}
应用程序将在对
set_data()
的两次调用中等待我输入一些内容并单击return。然后,一切照常进行。我添加了一个文本提示,以便在控制台中看到它时不那么混乱。我明白了:

这在某种程度上回答了你的问题吗?如果您正在
main()
中执行其他操作,请尝试将其剥离回此简单操作,然后再添加其他内容,直到找到导致问题的位

更新:
根据下面的注释提示,如果在另一次调用
getline()
之前放置
std::cin>
,它将从流中读取第一个单词,并将字符串的其余部分和
\n
字符保留在其中,
getline()
将其用作分隔符。因此,下次调用
getline()
时,它将自动从流中提取字符串的其余部分,而无需请求用户输入。我想这可能就是您所看到的。

您的函数
set_data
不仅设置成员
名称
,它还读取标准输入。如果您不提供一些输入,那么
std::getline
将永远等待。一个可能的原因可能是您在main中还执行了其他操作:@14DENDIK没有任何错误。看这个:我不知道你剩下的代码,所以不能说什么。问题在于你在两次调用之间没有显示什么。
std::cin
是如何使用的?您有:
Item*i=newitem()之后我们必须
删除它。然而,我不明白,为什么你需要一个堆分配来证明这一点。一个问题,为什么你要创建一个对象作为指针?在两个
set_data
调用之间做一些其他的
cin
输入。哇,我想指针警察真的用这个来干掉他们的傀儡了。我使用
new
delete
还是自动存储对MWE来说真的很重要吗,天哪@编码LUMISB此处使用自动存储与使用
new
delete
之间的唯一区别在于后者不是异常安全的,并且会使代码混淆,更难正确获取。没有理由不在这里使用自动存储。
// Entry point
int main(int argc, char** argv)
{
    // Yes I thought I would mix things up and use new instead of Item i; So shoot me.
    Item * i = new Item();

    i->set_data();
    i->printName();

    i->set_data();
    i->printName();

    delete i;

    return 0;
}