C++:在方法中创建对象并在方法外使用它

标签 c++

代码非常简单:

class SuperClass
{
public:
    virtual void someMethod() = 0;
};

class SubClass : public SuperClass
{
public:
    virtual void someMethod()
    {
        std::cout << "hello" << std::endl;
    }
};

class CallerClass
{
public:
    std::vector<SuperClass*> subClasses;

    CallerClass()
    {
        subClasses.push_back(&SubClass());
    }

    void callMethods()
    {
        subClasses[0]->someMethod();
    }
};

int main(int argx, char**argv)
{
    CallerClass cc;
    cc.callMethods();

    return 0;
}

当我实际调用尝试调用 CallerClass''callMethods()' 中的子类''someMethod()' 时,就会出现问题。在 Visual Studio 中,它只是在该行代码处中断,没有任何解释。我通过将push_back(&SubClass())更改为push_back(new SubClass())解决了这个问题。

我很好奇为什么后者有效而不是前者。我认为这是因为在方法中创建的对象只会存在于该方法中,并且通过使用“new”,实际上是在函数结束后为该对象分配了空间;但我向 SuperClass 添加了一个 int a = 1,并且能够以与“callMethods()”内部类似的方式访问它。

我一定错过了 C++ 的一些基本方面。请通知我。希望这不是太明显的事情。

最佳答案

subClasses.push_back(&SubClass());

您正在存储一个指向临时对象的指针,该对象随即被销毁。

然后,当您调用 someMethod 时,您正在调用已删除的无效对象指针上的方法。

subClasses.push_back(new SubClass());

您正在存储一个指向有效对象的指针,因此它可以工作。

关于C++:在方法中创建对象并在方法外使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26839389/

相关文章:

c++ - 试图修复我的类笔记

c++ - 通过 FILE* 操作流

c++ - 当数组大小大于 1,000,000 时,Cuda 未给出正确答案

c++ - 数组、对象、类来组织具有多项选择和真/假问题的测试问卷程序

c++ - 我收到有关枚举的错误(我认为)

c++ - 单元测试资源管理类中的私有(private)方法 (C++)

c++ - C++(旧/新标准)中最大的数字原始数据类型是什么

c++ - 确保主线程单独运行在它自己的核心上

C++ sql将整数传递给sql字符串

c++ - Gitlab CI Runner 预定义宏 MSBuild