gpt4 book ai didi

c++ - 使用共享指针的函数重载

转载 作者:行者123 更新时间:2023-11-30 02:21:20 27 4
gpt4 key购买 nike

我原以为这会起作用,但在编译过程中出现错误,如果有人能指出我的错误或我应该如何解决,将不胜感激。最好不要诉诸类型转换。是否有标准设计模式来执行此操作?

我做了一个简化的代码示例来显示问题和我的意图。我有一个(通常是抽象的)基类(形状)和派生类(方形、圆形)。我有对象的 shared_ptr 引用,并希望在基于 shared_ptr 类型的不同调用中执行相应的函数。

下面是不起作用的代码,缺少动态类型转换和丑陋的 if 语句,我不知道如何更正它。

//Standard includes
#include "memory"
#include <typeinfo>

class Shape
{
public:
virtual ~Shape() = default;
};
class Circle : public Shape { };
class Square : public Shape { };

class Logging
{
static void print(std::shared_ptr<Circle> shape)
{
std::cout << "This object is a " << typeid(*shape).name() << std::endl;
}

static void print(std::shared_ptr<Square> shape)
{
std::cout << "This object is a " << typeid(*shape).name() << std::endl;
}
};

int main() {
//Shared Pointer Shape Declaration
std::shared_ptr<Shape> circle = std::make_shared<Circle>();
std::shared_ptr<Shape> square = std::make_shared<Square>();

//Printing Shapes
Logging::print(circle); //Compiler ERROR: none of the 2 overloads could convert all the argument types
Logging::print(square); //Compiler ERROR: none of the 2 overloads could convert all the argument types

return 0;
}

提前感谢您提供任何有用的答案。

最佳答案

您的问题在于从 std::shared_ptr<Shape> 向下转型至 std::shared_ptr<Circle> .传递给函数时向上转型,即使使用智能指针,也是自动的,但不是向下转型。所以你的编译器找不到带有这个签名的打印函数:

static void Logging::print(std::shared_ptr<Shape> shape);

而且你有一个过载错误。

但是,由于您在函数内部使用取消引用运算符 ( * ),并且由于 std::shared_ptr重载此运算符,您可以使用 template 绕过此签名错误成员函数:

Logging 的变体print()功能:

class Logging
{
public:
template <class T>
static void print(std::shared_ptr<T> shape)
{
std::cout << "This object is a " << typeid(*shape).name() << std::endl;
}
};

Here is the example working .请记住,在使用模板时,如果您使用的是智能指针,请使用签名 std::shared_ptr<T> .

这样,您就可以避免使用静态和动态转换。

关于c++ - 使用共享指针的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48458483/

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