gpt4 book ai didi

c++ - 不使用 dynamic_cast<...>() 如何知 Prop 体的对象类型

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:32 24 4
gpt4 key购买 nike

我正在使用复合设计模式,我想从我的复合类中克隆我的对象。我试图在我的组件类中创建一个通用的克隆方法,但是当我尝试将我的对象的具体类型发送到通用(模板)方法时,'typeof' 和 'typeid' 返回抽象类类型。所以,当我尝试使用 new typeof(object) 时,我看到了错误

"invalid new-expression of abstract class type 'Component'".

我的编译器是 MigGW 32 位。

因为我不知道我的对象的类型,所以我不能使用 dynamic_cast。

我是在错误地使用 typeof/typeid 还是应该使用其他关键字来了解具体的对象类型?

#include <iostream>
#include <vector>
#include <typeinfo>

class Component
{
public:
template <typename Tdest> typename std::remove_cv<typename std::remove_pointer<Tdest>::type>::type* clone() const
{
typedef typename std::remove_cv<typename std::remove_pointer<Tdest>::type>::type NO_POINTER_NOR_CV;
return new typeof(NO_POINTER_NOR_CV)(*dynamic_cast<const NO_POINTER_NOR_CV*>(this));
}

virtual void manipulateComponents() = 0;
virtual void add(Component* comp) = 0;

protected:
std::vector<const Component*> _v;
};

class Leaf : public Component
{
void manipulateComponents() override { return; }
void add(Component* comp) override { return; }
};

class Composite : public Component
{
public:
void manipulateComponents() override
{
for(auto component : _v)
{
std::cout << typeid(component).name() << std::endl; // print PK9Component
component->clone<typeof(component)>();

/* ... */
}
}

void add(Component* comp) override { _v.push_back(comp); }
};

int main(int argc, char* argv[])
{
Component* l = new Leaf();
Component* c = new Composite();
Component* parent = new Composite();
parent->add(l);
parent->add(c);

parent->manipulateComponents();
}

最佳答案

您没有使用 typeid 获取派生类型的详细信息,因为您是在指针上使用它。在调用中取消引用 pionter 以获取派生类型的名称。

改变

std::cout << typeid(component).name() << std::endl; // print PK9Component
// PK9Component seems indicate that it is a pointer to a Component.

std::cout << typeid(*component).name() << std::endl;
// ^^

关于c++ - 不使用 dynamic_cast<...>() 如何知 Prop 体的对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48589070/

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