首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用c++返回抽象类

如何使用c++返回抽象类
EN

Stack Overflow用户
提问于 2016-06-24 22:23:17
回答 2查看 3K关注 1票数 0

在C++工作时遇到了麻烦。我已经尝试过几个答案,以及其他地方(比如:returning an abstract class from a function,和How do I make an abstract class properly return a concrete instance of another abstract class?),但我仍然遇到了麻烦--这些似乎并不完全符合……

我有一个抽象类,一个派生类:

代码语言:javascript
运行
复制
class AbstractClass {
    virtual std::string virtMethod() = 0;
}

class Derived : public AbstractClass {
    std::string virtMethod();
}

另外,我还尝试获取抽象类的返回类型(当然,返回派生类的实例)。

我试过使用指针和引用:

代码语言:javascript
运行
复制
AbstractClass* methodFromOtherClass() {
    if (somethingIsTrue) {
        Derived d = Derived();
        return &d;
    }

    SomeOtherDerived s = SomeOtherDerived();
    return &s;
}

在Xcode中,它给了我一个警告:

与返回的局部变量'd‘关联的堆栈内存地址

我尝试创建一个静态派生对象,但是无法在调用我的“methodFromOtherClass()”的方法中销毁它。

我也尝试过聪明的指针(尽管有人可能会指出我明显地滥用了它们):

代码语言:javascript
运行
复制
std::unique_ptr<AbstractClass> methodFromOtherClass() {
    if (somethingIsTrue) {
        Derived d = Derived();
        return std::unique_ptr<AstractClass>(&d);
    }

    SomeOtherDerived s = SomeOtherDerived();
    return std::unique_ptr<AstractClass>(&s);
}

以上这些,也许并不令人意外,给了我一个分段的错误。

我习惯于用Java轻松地做这件事.任何帮助都将不胜感激。C++目前对我来说不是一种很强的语言,所以它可能是我忽略的一些非常基本的语言。

EN

Stack Overflow用户

回答已采纳

发布于 2016-06-24 22:39:56

您的基本问题(正如警告告诉您的那样)是,您的函数正在返回局部变量的地址,并且在函数返回时局部变量不再存在。

您的第一个版本可以更改为

代码语言:javascript
运行
复制
AbstractClass* methodFromOtherClass()
{
    if (somethingIsTrue) 
    {
        Derived *d = new Derived();
        return d;
    }

    SomeOtherDerived *s = new SomeOtherDerived();
    return s;
}

请注意,这要求调用方完成返回的指针的delete操作。

第二个版本可以更改为

代码语言:javascript
运行
复制
std::unique_ptr<AbstractClass> methodFromOtherClass()
{
    if (somethingIsTrue)
    {
        Derived *d = new Derived();
        return d;
    }

    SomeOtherDerived *s = new SomeOtherDerived();
    return s;
}

它将调用者从释放动态分配对象的义务中释放出来。

在这两种情况下,AbstractClass都需要一个虚拟析构函数,以避免释放返回对象时的未定义行为。

您的根本问题是,您正在考虑Java的工作方式,而C++在这方面的工作方式与Java非常不同。停止尝试用Java类推学习C++ --在这种情况下,您会给自己制造更多的麻烦,这是不值得的。从C++的角度来看,Java将指针和引用的概念融合在一起,所以像在Java中那样使用C++指针和引用是C++中的麻烦所在。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38022920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档