Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法保存到类中的变量?_C++ - Fatal编程技术网

C++ 无法保存到类中的变量?

C++ 无法保存到类中的变量?,c++,C++,初学者代码。汇编得很好。SetMemo似乎可以工作(因为它重复输入),但当我尝试使用ReadMemo时,savedmemo似乎为空。除此之外,行中包含的任何其他内容都将打印。我做错了什么?我是不是不小心把变量擦到别处了 #include "pch.h" #include <iostream> #include <string> using namespace std; int firstboot = 1; class MEMOCLASS { public:

初学者代码。汇编得很好。SetMemo似乎可以工作(因为它重复输入),但当我尝试使用ReadMemo时,savedmemo似乎为空。除此之外,行中包含的任何其他内容都将打印。我做错了什么?我是不是不小心把变量擦到别处了

#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
int firstboot = 1;

class MEMOCLASS {
    public:
    void SetMemo(string memoinput_pvt) {
        savedmemo = memoinput_pvt;
        cout << savedmemo << " saved as a memo!" << endl;
        };
    string ReadMemo(){
        return savedmemo;
    };
    private:
    string savedmemo;
};

int main()
{
    MEMOCLASS MMObj;
    string input;
    string memoinputmain;
    if (firstboot == 1) {
        cout << "Hello! Please use \"write memo\" to store a memo or \"read memo\" to read a previously stored memo. Type \"exit\" to quit the programme." << endl;
        firstboot = 0;
    }
    else {
        cout << "Ok, anything else I can do for you?" << endl;
    }
    getline(cin, input);
    if (input == "write memo") {
        cout << "Ok, go ahead. Press Enter to record the Memo.\n";
        getline(cin, memoinputmain);
        MMObj.SetMemo(memoinputmain);
        main();
    }
    else if (input == "read memo") {
    cout << "The memo reads: " << MMObj.ReadMemo() << endl;
    main();
    }
    else if (input == "exit")
    {
        cout << "Cya!\n";
        return 0;

    }
    else if (input == "help")
    {
        cout << "Use \"write memo\" to store a memo or \"read memo\" to read a previously stored memo. Type \"exit\" to quit the programme.\n";
        main();
    }
    else {
        cout << "Invalid input!\n";
        main();
    }
}
#包括“pch.h”
#包括
#包括
使用名称空间std;
int firstboot=1;
课堂备忘录{
公众:
作废设置备忘(字符串备忘输入){
savedmemo=memoinput\u pvt;
可能有两个问题:

在C++中,不允许递归调用。相反,使用循环(以任何方式调用<代码>主< /代码>,无论从何处,在代码中是正式的。)< /P>
  • 由于递归调用
    main
    ,因此每次调用都会生成一个new和不同的变量
    MMObj

  • 两个问题:

    在C++中,不允许递归调用。相反,使用循环(以任何方式调用<代码>主< /代码>,无论从何处,在代码中是正式的。)< /P>
  • 由于递归调用
    main
    ,因此每次调用都会生成一个new和不同的变量
    MMObj


  • 首先,要记住一点。你不应该调用
    main

    现在,当您调用main时,您创建的对象将不再存在。 有类似的代码吗

    void foo()
    {
        int x = 6;
        if (x == 6)
        {
            x = 7;
        }
        foo();
    }
    
    当再次调用时,将生成一个新的
    x
    ,并将
    x
    的值设为6

    您可以传入对象以使其保持在周围

    void foo(int x)
    {
        if (x == 6)
        {
            x = 7;
        }
        foo(x);
    }
    
    在您的情况下,创建一个新函数,例如
    runMMObj

    MEMOCLASS runMMObj(MEMOCLASS MMObj) //you know this is a copy, right?
    {
        //do reads and writes here
        return MMObj;
    }
    
    int main()
    {
        MEMOCLASS MMObj;
        MMObj = runMMObj(MMObj);
        //rerun your new function if you want
    }
    

    首先,要记住一点。你不应该调用
    main

    现在,当您调用main时,您创建的对象将不再存在。 有类似的代码吗

    void foo()
    {
        int x = 6;
        if (x == 6)
        {
            x = 7;
        }
        foo();
    }
    
    当再次调用时,将生成一个新的
    x
    ,并将
    x
    的值设为6

    您可以传入对象以使其保持在周围

    void foo(int x)
    {
        if (x == 6)
        {
            x = 7;
        }
        foo(x);
    }
    
    在您的情况下,创建一个新函数,例如
    runMMObj

    MEMOCLASS runMMObj(MEMOCLASS MMObj) //you know this is a copy, right?
    {
        //do reads and writes here
        return MMObj;
    }
    
    int main()
    {
        MEMOCLASS MMObj;
        MMObj = runMMObj(MMObj);
        //rerun your new function if you want
    }
    

    main()一个函数的每个递归调用都有每个非静态局部变量的唯一实例。你做了<代码> FixBooS/<代码>一个全局变量,关于<代码> MMObj < /代码>?他们这样做的惯用方式不是递归,而是使用简单的C++。ode>while(true)
    loop和
    break;
    ing当一个循环完成时。如果
    else已经保证只执行一个块,否则将有
    continue;
    跳过循环迭代的一部分。
    main()一个函数的每个递归调用都有每个非静态局部变量的唯一实例。你做了<代码> FixBooS/<代码>一个全局变量,关于<代码> MMObj < /代码>?他们这样做的惯用方式不是递归,而是使用简单的C++。ode>while(true)
    loop和
    break;
    ing当一个循环完成时。如果
    else已经保证只执行一个块,否则将有
    continue;
    跳过循环迭代的一部分。不应该是2.因为调用
    main
    ,任何事情都可能发生?目前,它听起来好像是一个可以依赖的东西,但afaik调用
    main
    是undefined@user463035818很好,但是很简单。@user463035818别忘了,未定义也可以包括预期的工作…如果编译器已经定义了它将要做的工作,那么虽然代码可能无法移植到其他编译器,但结果是user463035818从形式上看,它当然是UB,但对于几乎所有未定义的行为,实现仍然可以做一些事情。在这种情况下,它显然是作为“正常”处理的递归函数调用。它起作用了。删除了对main的所有调用,将firstboot移到main中,在“string memoinputmain”下面添加了一个while循环,它神奇地起作用了。非常感谢。应该是“因为你调用
    main
    ,任何事情都可能发生”?目前,它听起来好像是一个可以依赖的东西,但afaik调用
    main
    是undefined@user463035818很好,但是很简单。@user463035818别忘了,未定义也可以包括预期的工作…如果编译器已经定义了它将要做的工作,那么虽然代码可能无法移植到其他编译器,但结果是user463035818从形式上看,它当然是UB,但对于几乎所有未定义的行为,实现仍然可以做一些事情。在这种情况下,它显然是作为“正常”处理的递归函数调用。它成功了。删除了对main的所有调用,将firstboot移到main中,在“string memoinputmain”下面添加了一个while循环,它神奇地成功了。非常感谢。