如何在不使用reset和new的情况下使用纯抽象类的共享指针?

失落的阶梯

在C ++中,如何在不使用reset和new的情况下使用纯抽象类的共享指针?

该示例有些虚构,但说明了我遇到的问题。

看一下run()方法:reset有效,但注释行不起作用...

#include <iostream>
#include <map>
#include <memory>

using namespace std;

class Interf{

public:
    virtual void doSomething()=0;

};


class Foo : public Interf {

public:

    Foo(){
        cout << "Foo constructed\n";
    }

    shared_ptr<Interf> innerInterf;

    void doSomething(){
        cout << "Foo:doSomething()\n";
        innerInterf->doSomething();
    }
    void run(){
        cout << "run() called\n";

        innerInterf.reset(new Bar());                     // this works

        //Bar b;
        //innerInterf = make_shared<Interf>((Interf)b);   // how can i get this to work?

    }

    class Bar : public Interf {
    public:
        Bar(){
            cout << "Bar constructed\n";
        }
        ~Bar(){
            cout << "Bar destroyed\n";
        }

        void doSomething(){
            cout << "Bar:doSomething()\n";
        }
    };


};


int main(){
    Foo foo;
    foo.run();

    Interf *interf;
    interf = &foo;
    cout << "interf.doSomething()\n";
    interf->doSomething();
}
卡米尔库克

与其照new Bar写作来写,也不是make_shared<Bar>BarInterf

Bar b;
innerInterf = make_shared<Bar>(b); // copy constructed? (no idea if that is what you want?)
innerInterf = make_shared<Bar>();  // calls Bar::Bar()

因为我看到了非虚拟析构函数,所以您可能想要研究何时使用虚拟析构函数,还需要研究0/3/5规则(如果尚未使用)。

无论如何,很好的问题和良好的MCVE。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不使用android_app *的情况下获取ANativeActivity指针和Cpp

来自分类Dev

如何在不使用jQuery但使用纯Javascript的情况下使用AJAX提交此表单

来自分类Dev

如何在不使用jQuery但使用纯Javascript的情况下使用AJAX提交此表单

来自分类Dev

如何在没有默认构造函数的情况下实现抽象类的Decorator类?

来自分类Dev

如何在没有默认构造函数的情况下实现抽象类的Decorator类?

来自分类Dev

如何在不使用 [] 运算符的情况下使用指针组织数组

来自分类Dev

如何在不使用存储库的情况下共享EntityFramework 6数据上下文?

来自分类Dev

如何在不使用指针的情况下从模板化方法返回NULL

来自分类Dev

如何在不使用指针的情况下将字符串分成两半

来自分类Dev

如何在不使用C的指针的情况下通过函数传递2D数组

来自分类Dev

如何在不使用指针的情况下从数组中获取输出?

来自分类Dev

如何在不使用reset的情况下撤消git中的快速合并

来自分类Dev

如何在不使用reset的情况下撤消git中的快速合并

来自分类Dev

如何在抽象类中使用getter和setter

来自分类Dev

如何在抽象类中使用getter和setter

来自分类Dev

如何在不使用库的情况下在.NET项目之间共享类?

来自分类Dev

在这种情况下应该使用接口还是抽象类?

来自分类Dev

在以下情况下正确使用抽象类或接口

来自分类Dev

Log4j2:如何在不使用Throwable的情况下获取类名和行号?

来自分类Dev

如何在不使用类加载器的情况下动态加载Java类?

来自分类Dev

如何在不使用任何操作类的情况下使用Struts2约定

来自分类Dev

如何在不使用IB的情况下使用自定义UITabBar类创建UITabBarController?

来自分类Dev

如何在不使用std :: function创建类实例的情况下使用成员函数?

来自分类Dev

如何在不使用实体类的情况下使用EclipseLink与表进行交互?

来自分类Dev

如何在不使用$ scope的情况下使用$ emit / $ on?

来自分类Dev

如何在不使用xml的情况下使用ViewPager?

来自分类Dev

如何在不使用mysql的情况下使用表

来自分类Dev

如何在不使用getter的情况下访问派生类的静态成员?

来自分类Dev

如何在不使用复制构造函数的情况下初始化类成员

Related 相关文章

  1. 1

    如何在不使用android_app *的情况下获取ANativeActivity指针和Cpp

  2. 2

    如何在不使用jQuery但使用纯Javascript的情况下使用AJAX提交此表单

  3. 3

    如何在不使用jQuery但使用纯Javascript的情况下使用AJAX提交此表单

  4. 4

    如何在没有默认构造函数的情况下实现抽象类的Decorator类?

  5. 5

    如何在没有默认构造函数的情况下实现抽象类的Decorator类?

  6. 6

    如何在不使用 [] 运算符的情况下使用指针组织数组

  7. 7

    如何在不使用存储库的情况下共享EntityFramework 6数据上下文?

  8. 8

    如何在不使用指针的情况下从模板化方法返回NULL

  9. 9

    如何在不使用指针的情况下将字符串分成两半

  10. 10

    如何在不使用C的指针的情况下通过函数传递2D数组

  11. 11

    如何在不使用指针的情况下从数组中获取输出?

  12. 12

    如何在不使用reset的情况下撤消git中的快速合并

  13. 13

    如何在不使用reset的情况下撤消git中的快速合并

  14. 14

    如何在抽象类中使用getter和setter

  15. 15

    如何在抽象类中使用getter和setter

  16. 16

    如何在不使用库的情况下在.NET项目之间共享类?

  17. 17

    在这种情况下应该使用接口还是抽象类?

  18. 18

    在以下情况下正确使用抽象类或接口

  19. 19

    Log4j2:如何在不使用Throwable的情况下获取类名和行号?

  20. 20

    如何在不使用类加载器的情况下动态加载Java类?

  21. 21

    如何在不使用任何操作类的情况下使用Struts2约定

  22. 22

    如何在不使用IB的情况下使用自定义UITabBar类创建UITabBarController?

  23. 23

    如何在不使用std :: function创建类实例的情况下使用成员函数?

  24. 24

    如何在不使用实体类的情况下使用EclipseLink与表进行交互?

  25. 25

    如何在不使用$ scope的情况下使用$ emit / $ on?

  26. 26

    如何在不使用xml的情况下使用ViewPager?

  27. 27

    如何在不使用mysql的情况下使用表

  28. 28

    如何在不使用getter的情况下访问派生类的静态成员?

  29. 29

    如何在不使用复制构造函数的情况下初始化类成员

热门标签

归档