基本上我有一个基本结构,其中包含作为
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++ 没有这种对象提升功能(其他一些语言有)。
您可能需要的是直接创建派生对象,而不先创建中间基类对象。至少在您的示例中,这样的对象没有自己的合法用途。基类可以而且应该抽象化,以防止错误的实例化。
如果由于某种原因您确实需要使 BaseStruct 可实例化,请将数据提取到单独的类层次结构,并使 BaseStruct 包含指向数据对象的指针(您不会有 DerivedStruct,只有 DerivedData)。