了解发送方对象类型的最佳方法是什么
What is best way to know type of sender object?
我有类的层次结构:
class A
{
};
class B : public A
{
};
class C : public B
{
};
class D : public A
{
};
我有一些功能,它执行通知:
void notify(A* sender, const NotificationType notification)
{
}
我的问题是如何找出发送者对象的确切类型。我想找到一种优雅的方法来解决这个问题。我不喜欢将动态转换用于这些目的。可能的方法是在类A中定义枚举,如:
enum ClassType
{
CLASS_A,
CLASS_B,
CLASS_C,
CLASS_D
};
以及定义虚拟方法:
virtual ClassType get_type(void) const;
但是这种方法的可扩展性很差。另一种将这些信息保存在NotificationType中的方法,但它的可扩展性也很差。
附言:我只想使用类似的代码:
我想使用类似的代码:
void notify(A* sender, const NotificationType notification)
{
if (sender is object of A)
new GuiA();
else if (sender is object of B)
new GuiB();
else if (sender is object of C)
new GuiC();
else
new GuiD();
}
要根据sender
的具体类型创建匹配的GUI对象,可以在A
中将工厂传递给某种工厂方法。
class A
{
public:
virtual Agui* createGui(GuiFactory& fac) = 0;
};
class GuiFactory
{
public:
virtual Agui* forB(B&) = 0;
virtual Agui* forC(B&) = 0;
virtual Agui* forD(D&) = 0;
};
class B : public A
{
public:
Agui* createGui(GuiFactory& fac)
{
return fac.forB(*this);
}
};
void notify(A* sender, const NotificationType notification)
{
// Use A interface...
// Get the concrete GuiFactory from somewhere, and use it
auto gui = sender->createGui(win32GuiFactory);
}
如果你想知道类型来持久化你的层次结构,可以考虑使用boost::TypeIndex(http://www.boost.org/doc/libs/develop/doc/html/boost_typeindex.html)。
如果你想知道类型以不同的方式处理不同的类型,可以考虑使用Visitor代替类型标识符,或者使用虚拟函数制作抽象接口来满足你的需求。
已编辑
您的目标是为不同的类型创建不同的UI对象。您可以使用以下模型来达到您的目标:
class UIObject {...};
class UIObjectFactory {...};
class A {
public:
virtual std::unique_ptr<UIObject> Create(UIObjectFactory& factory) = 0;
};
void OnNotify(A* sender) {
auto ptr = sender->Create(GetUIFactory());
...
}
以及定义虚拟方法:
virtual ClassType get_type(void) const;
实现这一点并消除可伸缩性问题的最简单方法是在每个类A
、B
、C
…中实现get_type()
成员函数。。。这边:
typedef uintptr_t ClassType;
virtual ClassType get_type() const
{
static int dummy;
return reinterpret_cast<ClassType>(&dummy);
}
将为添加此成员函数的每个类创建一个静态变量dummy
,以便返回值唯一标识该类。
相关文章:
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 使用类型id运算符的最佳替代方法
- 枚举元组类型的最佳方法?
- 生成包含给定类型的 N 个参数的可变参数列表的最佳方法?
- 使用相同方法但不同成员类型构建类的最佳方法
- 用于浮点值的最佳变量类型
- 将不同类型的多种参数发送到处理方法的最佳方法.C
- 将 2D 矢量转换为 C 类型的最佳方法(适用于 SGX 飞地)
- 什么是在C 中存储结果INT*的最佳数据类型
- 在C++中定义联合类型标志的最佳方法
- C++最佳实践 - 函数类型别名 std::function<T> 或 T
- 删除类型转换指针的最佳方法
- 用于代替在C++中具有模板基类型的模板类的 C# 的最佳粒子?
- 比较UINTPTR_T和指针类型的最佳方法是什么?
- 返回可能在C++中分配在堆栈上的成员时,最佳指针/引用类型是什么
- 在 C++ 中修复类型转换警告的最佳方法
- 在C++结构中处理未知类型的最佳方法是什么?
- 了解发送方对象类型的最佳方法是什么
- 在C++中实现Fraction类型的最佳方法是什么