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;
}