gpt4 book ai didi

c++ - 具有虚拟类的 unique_ptr

转载 作者:行者123 更新时间:2023-12-03 07:09:13 24 4
gpt4 key购买 nike

这可能真的很愚蠢,但我不明白我得到的 g++ 输出。我试图将指向派生对象的指针保存到虚拟基类。当我运行注释代码时,它工作正常并且如预期的那样,将它保存在 unique_ptr 中不会编译。

错误信息:

In file included from /usr/include/c++/4.9/memory:81:0,
from 2:
/usr/include/c++/4.9/bits/unique_ptr.h: In instantiation of 'typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = base; _Args = {derived*}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<base>]':
20:66: required from here
/usr/include/c++/4.9/bits/unique_ptr.h:765:69: error: invalid new-expression of abstract class type 'base'
{ return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
^
4:7: note: because the following virtual functions are pure within 'base':
6:18: note: virtual void base::foo()
7:18: note: virtual void base::bar()

示例代码

#include <memory>

class base {
public:
virtual void foo() = 0;
virtual void bar() = 0;
};

class derived : public base {
public:
derived() { }
void foo() override { printf("foo\n"); }
void bar() override { printf("bar\n"); }
void foobar() { printf("foobar\n"); }
};

int main()
{
std::unique_ptr<base> dv = std::make_unique<base>(new derived());

dv->foo();
reinterpret_cast<derived*>(dv.get())->foobar();
//base* dv = new derived();
//dv->foo();
//reinterpret_cast<derived*>(dv)->foobar();
}

我知道这一定是一些愚蠢的错误或者是我的一个很大的误解,但是在使用 unique_ptr 搜索虚拟基类时我没有找到解决方案

最佳答案

如评论中所述,std::make_unique 的参数应该是所创建对象的构造函数所需的参数。在您的情况下,这将是一个空参数列表(derived 构造函数不需要参数)。此外,您不能为虚拟基类创建 unique_ptr 对象;相反,它应该是指向派生类的指针。

这是一个可以编译的版本(您不需要显式地转换 unique_ptr 对象:多态性会解决这个问题):

#include <memory>

class base {
public:
virtual void foo() = 0;
virtual void bar() = 0;
virtual ~base() = default; // Add virtual destructor, to be safe!
};

class derived : public base {
public:
derived() { }
void foo() override {
printf("foo\n");
}
void bar() override {
printf("bar\n");
}
void foobar() {
printf("foobar\n");
}
};

int main()
{
std::unique_ptr<base> dv = std::make_unique<derived>();
dv->foo();
return 0;
}

或者(这可能是你困惑的一部分),你可以使用unique_ptr构造函数,而不是调用make_unique作为第一个main 行:

    std::unique_ptr<base> dv{new derived()};

关于c++ - 具有虚拟类的 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64928085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com