在C++工作时遇到了麻烦。我已经尝试过几个答案,以及其他地方(比如:returning an abstract class from a function,和How do I make an abstract class properly return a concrete instance of another abstract class?),但我仍然遇到了麻烦--这些似乎并不完全符合……
我有一个抽象类,一个派生类:
class AbstractClass {
    virtual std::string virtMethod() = 0;
}
class Derived : public AbstractClass {
    std::string virtMethod();
}另外,我还尝试获取抽象类的返回类型(当然,返回派生类的实例)。
我试过使用指针和引用:
AbstractClass* methodFromOtherClass() {
    if (somethingIsTrue) {
        Derived d = Derived();
        return &d;
    }
    SomeOtherDerived s = SomeOtherDerived();
    return &s;
}在Xcode中,它给了我一个警告:
与返回的局部变量'd‘关联的堆栈内存地址
我尝试创建一个静态派生对象,但是无法在调用我的“methodFromOtherClass()”的方法中销毁它。
我也尝试过聪明的指针(尽管有人可能会指出我明显地滥用了它们):
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++目前对我来说不是一种很强的语言,所以它可能是我忽略的一些非常基本的语言。
发布于 2016-06-24 22:39:56
您的基本问题(正如警告告诉您的那样)是,您的函数正在返回局部变量的地址,并且在函数返回时局部变量不再存在。
您的第一个版本可以更改为
AbstractClass* methodFromOtherClass()
{
    if (somethingIsTrue) 
    {
        Derived *d = new Derived();
        return d;
    }
    SomeOtherDerived *s = new SomeOtherDerived();
    return s;
}请注意,这要求调用方完成返回的指针的delete操作。
第二个版本可以更改为
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++中的麻烦所在。
https://stackoverflow.com/questions/38022920
复制相似问题