gpt4 book ai didi

c++ - 在 C++ 中我们有更好的返回抽象类的方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:35 24 4
gpt4 key购买 nike

我想开始在我的 C++ 代码中加入一些接口(interface),使我更容易使用 mock 进行单元测试。

问题是从 C++ 中的方法返回抽象类是一件很痛苦的事情。您不能按值返回,因此您需要返回一个指针或引用。

考虑到 C++ 在过去六七年的所有发展,我想我会问我们是否有更好的方法来返回抽象基类。没有噪音的界面看起来像这样,但我敢肯定这是不可能的。

IBaseInterface getThing() {return DerivedThing{};}

我记得以前这样做的方式是使用指针(现在可能是智能指针):

std::unique_ptr<IBaseInterface> getThing() {return std::make_unique<DerivedThing>();}

指针的问题是我从来没有真正计划利用 nullptr,所以处理指针而不是值的开销和噪音对我作为读者没有任何值(value)。

有没有我不知道的更好的方法来处理这个问题?

最佳答案

编辑:提供完整示例,包括使多态句柄可复制。

#include <iostream>
#include <utility>
#include <memory>

struct IBaseInterface {
IBaseInterface() = default;
IBaseInterface(IBaseInterface const&) = default;
IBaseInterface(IBaseInterface &&) = default;
IBaseInterface& operator=(IBaseInterface const&) = default;
IBaseInterface& operator=(IBaseInterface &&) = default;
virtual ~IBaseInterface() = default;

virtual std::unique_ptr<IBaseInterface> clone() const = 0;
virtual void do_thing() = 0;
};

struct handle
{
handle(std::unique_ptr<IBaseInterface> ptr)
: _impl(std::move(ptr))
{}

handle(handle const& r)
: _impl(r._impl->clone())
{}

handle(handle && r)
: _impl(std::move(r._impl))
{}

handle& operator=(handle const& r)
{
auto tmp = r;
std::swap(_impl, tmp._impl);
return *this;
}

handle& operator=(handle && r)
{
_impl = std::move(r._impl);
return *this;
}


// interface here
void do_thing() { _impl->do_thing(); }

private:
std::unique_ptr<IBaseInterface> _impl;
};

struct DerivedThing : IBaseInterface
{
std::unique_ptr<IBaseInterface> clone() const override
{
return std::make_unique<DerivedThing>(*this);
}

void do_thing() override
{
std::cout << "I'm doing something" << std::endl;
}

};

handle make_thing()
{
return handle(std::make_unique<DerivedThing>());
};

int main()
{
auto a = make_thing();
auto b = a;

a.do_thing();
b.do_thing();

return 0;
}

现在使用您的句柄,就好像它具有(可移动的)值语义一样

关于c++ - 在 C++ 中我们有更好的返回抽象类的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066611/

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