无法在类内第二次设置字符串类型[关闭]

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 &gt;&gt; 放在另一个调用 getline() 之前,它将从流中读取第一个单词并留下字符串的其余部分和 \n 字符,getline() 用于它的分隔符。因此,下次您调用 getline() 时,它将自动从流中提取字符串的其余部分,而无需请求用户输入。我想这可能就是您所看到的。

【讨论】:

你有这个:Item * i = new Item();,之后我们必须delete 。但是,我不明白,为什么需要堆分配来证明这一点。 一个问题,为什么要创建一个对象作为指针? 在两个set_data 调用之间做一些其他cin 输入。 哇,我猜指针警察真的用这个把他们的假人吐了出来。对于 MWE,我使用 newdelete 还是自动存储真的很重要吗,天哪?! @CodingLumisb 在此处使用自动存储与使用newdelete 之间的唯一区别在于后者不是异常安全的,并且会使代码混乱且难以正确处理。这里没有理由不使用自动存储。

以上是关于无法在类内第二次设置字符串类型[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过字符串方法名称在类内调用python静态方法[重复]

GitHub 两周内第二次服务中断,原因竟然是服务器被盗?

第二次考试 试题

第二次单元测试

在类内设置参数,Null 对象

14:操作重载和类型转换