繁体   English   中英

与 std::unique_ptr 和抽象类相关的编译错误

[英]Compile error associated with std::unique_ptr and abstract classes

我有从基础 class 继承的 class。 基础 class 包含在派生的 class 中重写的纯虚函数。 我用派生的 class 的 std::unique_ptr 实例化基础 class object 但得到编译时错误

class Base { 
public:
    ~Base () = default;
    initBase () { count = 0; }

    virtual void method1() = 0; 
    virtual void method2() = 0;  

private:
    int count;
}; 

class Child final : public Base { 
public: 
    Child() = default;
    ~Child() = default;

    void method1() override { std::cout << "B Running method 1\n"; } 
    void method2() override { std::cout << "B Running method 2\n"; }
}; 

class myClass {
public:
    myClass(std::unique_ptr<Base> base) { _base(std::move(base)) };
    ~myClass() = default();

private:
    std::unique_ptr<Base> _base;
};

int main() {     
myClass obj = myClass(std::make_unique<Child>()); 
}

编译器给出以下错误:

error: invalid new-expression of abstract class type 'Base'
     { return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
because the following virtual functions are pure within 'Base':
 class A {
'virtual void Base::method1()'
     virtual void method1() = 0;
'virtual void Base::method2()'
     virtual void method2() = 0;

您的代码中有几个拼写错误:

Base

  • 改变

    initBase () { count = 0; }

    Base () { count = 0; }

Child中:

  • 改变

    myClass(std::unique_ptr<Base> base) { _base(std::move(base)) };

    myClass(std::unique_ptr<Base> base): _base(std::move(base)) { }

  • 改变

    ~myClass() = default();

    ~myClass() = default;

main()中:

  • 改变

    myClass obj = myClass(std::make_unique<Child>());

    myClass obj(std::make_unique<Child>());

#include <iostream>
#include <memory>

class Base { 
public:
    ~Base () = default;
    Base () { count = 0; }

    virtual void method1() = 0; 
    virtual void method2() = 0;  

private:
    int count;
}; 

class Child final : public Base { 
public: 
    Child() = default;
    ~Child() = default;

    void method1() override { std::cout << "B Running method 1\n"; } 
    void method2() override { std::cout << "B Running method 2\n"; }
}; 

class myClass {
public:
    myClass(std::unique_ptr<Base> base) : _base(std::move(base)) { }
    ~myClass() = default;

private:
    std::unique_ptr<Base> _base;
};

int main() {     
    myClass obj(std::make_unique<Child>()); 
    std::cout << "OK";
}

有了这些修复,代码就可以正常编译了。

现场演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM