如何将值分配给向下转换为共享指针时不会重置的基本结构

问题描述 投票:0回答:1

基本上我有一个基本结构,其中包含作为

shared_ptr

的值

我为该基本结构分配值

#include<iostream>
#include<memory>


enum class Enums
{
 A,
 B,
 UNKNOWN,
};

struct BaseStruct
{
 Enums Type = Enums::UNKNOWN;
};

struct DerivedStruct : public BaseStruct
{
 int MoreData = 0;
};


struct AnotherDerivedStruct : public BaseStruct
{
 char different_Data;
};

我必须向下转换这个基本结构以分配更多值。

我不能直接使用

static_pointer_cast
,因为我需要首先使用
make_shared<DerivedStruct>()
make_shared<AnotherDerivedStruct>()
,因为结构可以派生为不同的结构。

所以

int main()
{
    auto BaseToken = std::make_shared<BaseStruct>();

    BaseToken->Type = Enums::B;
    
    bool ComplicatedLogicalLogic = false;
    
    if (ComplicatedLogicalLogic)
    {
     BaseToken = std::make_shared<DerivedStruct>();
     auto DerivedToken = std::static_pointer_cast<DerivedStruct> 
     (BaseToken);
     DerivedToken->Type; //this will be undefined
    }
    else
    {
     BaseToken = std::make_shared<AnotherDerivedStruct>();
     auto DerivedToken = std::static_pointer_cast<AnotherDerivedStruct> 
     (BaseToken);
     
     /// The value is reset so this condition is never met
     if (DerivedToken->Type == Enums::B)
     {
         std::cout << "IS B" << '\n';
     }
    
    }
}

这允许

static_pointer_cast
但随后原始值被擦除,因此我必须暂时存储这些值然后重新分配它们。

我发现使用

static_cast
可能是一个解决方案,但是当我尝试它时,Visual Studio 说有
no suitable user-defined from shared_ptr<BaseStruct> to <DerivedStruct>

公平地说,该示例没有使用

shared_ptrs
,那么是否值得废弃
shared_ptrs
并仅使用原始指针?

c++ struct casting downcast
1个回答
0
投票

您想要创建一个基类对象,使用它,然后将其提升为派生类对象。 C++ 没有这种对象提升功能(其他一些语言有)。

您可能需要的是直接创建派生对象,而不先创建中间基类对象。至少在您的示例中,这样的对象没有自己的合法用途。基类可以而且应该抽象化,以防止错误的实例化。

如果由于某种原因您确实需要使 BaseStruct 可实例化,请将数据提取到单独的类层次结构,并使 BaseStruct 包含指向数据对象的指针(您不会有 DerivedStruct,只有 DerivedData)。

© www.soinside.com 2019 - 2024. All rights reserved.