无法在类内第二次设置字符串类型[关闭]
Posted
技术标签:
【中文标题】无法在类内第二次设置字符串类型[关闭]【英文标题】:Can't set the string type second time, inside the class [closed] 【发布时间】:2018-06-08 11:01:51 【问题描述】:我有课
class Item
private:
string name;
public:
void set_data()
getline(cin, name);
我在主函数中设置了一次名称的值,但是当我想给它另一个值时,我不能。我的意思是当我第二次从同一个对象调用函数时,它什么也不做。
【问题讨论】:
您的函数set_data
不仅设置成员name
,它还从标准输入中读取。如果您不提供一些输入,那么std::getline
将永远等待。
一个可能的原因可能是您在 main 中还做了其他事情:Why does std::getline() skip input after a formatted extraction?
@14DENDIK 没有错。看到这个:ideone.com/bqJvc2我不知道你剩下的代码,所以不能说什么。
问题在于您在两次通话之间没有显示的内容。 std::cin
是如何使用的?
【参考方案1】:
首先,在 C++ 中,您的实现应该与声明分开,除非您使用的模板并非如此。这不是 Java。
其次,您的示例代码缺少右括号。我已提交修改以添加它并改进您的代码格式。
除此之外,以下实现对我有用:
项目.h
class Item
private:
std::string name;
public:
void set_data();
void printName();
;
项目.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;
main.cpp
// 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;
应用程序将在两次调用set_data()
时等待我输入内容并按回车键。然后它继续正常。我添加了一个文本提示,以便在控制台中看到它不那么令人困惑。我明白了:
这是否以某种方式回答了您的问题?如果您在 main()
中执行其他操作,请尝试将其剥离回这个简单的操作,然后重新添加其他内容,直到找到导致问题的位。
更新:
正如下面的 cmets 所提示的,如果您将 std::cin >>
放在另一个调用 getline()
之前,它将从流中读取第一个单词并留下字符串的其余部分和 \n
字符,getline()
用于它的分隔符。因此,下次您调用 getline()
时,它将自动从流中提取字符串的其余部分,而无需请求用户输入。我想这可能就是您所看到的。
【讨论】:
你有这个:Item * i = new Item();
,之后我们必须delete
。但是,我不明白,为什么需要堆分配来证明这一点。
一个问题,为什么要创建一个对象作为指针?
在两个set_data
调用之间做一些其他cin
输入。
哇,我猜指针警察真的用这个把他们的假人吐了出来。对于 MWE,我使用 new
和 delete
还是自动存储真的很重要吗,天哪?!
@CodingLumisb 在此处使用自动存储与使用new
和delete
之间的唯一区别在于后者不是异常安全的,并且会使代码混乱且难以正确处理。这里没有理由不使用自动存储。以上是关于无法在类内第二次设置字符串类型[关闭]的主要内容,如果未能解决你的问题,请参考以下文章