【发布时间】:2015-04-08 15:54:12
【问题描述】:
我想实现一个方法CastTo(classId),它返回classId参数与参数匹配的基对象的地址,否则将返回nullptr。
class A {
public:
const std::string WhoAmI () { return "A"; }
static const std::string ClassId() { return "A"; }
const void* CastTo(const std::string& classId) const {
if (classId == ClassId()) return dynamic_cast<const A*>(this);
if (classId == B.ClassId()) return dynamic_cast<const B*>(this); //*
if (classId == C.ClassId()) return dynamic_cast<const C*>(this); //*
return nullptr;
}
//more methods
};
class B : public A{
public:
const std::string WhoAmI() { return "B"; }
static const std::string ClassId() { return "B"; }
const void* CastTo(const std::string& classId) const {
if (classId == A.ClassId()) return dynamic_cast<const A*>(this); //*
if (classId == ClassId()) return dynamic_cast<const B*>(this);
if (classId == C.ClassId()) return dynamic_cast<const C*>(this); //*
return nullptr;
}
//more methods
};
class C : public B{
public:
const std::string WhoAmI() { return "C"; }
static const std::string ClassId() { return "C"; }
const void* CastTo(const std::string& classId) const {
if (classId == A.ClassId()) return dynamic_cast<const A*>(this); //*
if (classId == B.ClassId()) return dynamic_cast<const B*>(this); //*
if (classId == ClassId()) return dynamic_cast<const C*>(this);
return nullptr;
}
//more methods
};
但是,在注释行中,我收到错误“不允许使用类型名”。我也尝试使用“->”而不是“。”但错误仍然存在。 我不明白为什么上面的代码不起作用,因为方法被声明为静态的。
这是作业的一部分,所以它必须按照我描述的方式工作,并且下面的测试代码必须没问题。
A* a = new C();
assert(a->Cast<C>().WhoAmI() == "C"); //Cast is a template used for
assert(a->Cast<B>().WhoAmI() == "B"); //calling CastTo
assert(a->Cast<A>().WhoAmI() == "A");
B* b = a->Cast<B>();
C* c = a->Cast<C>();
使用的模板:
template <typename T> T* Cast (void)
{ return static_cast<T*>(CastTo(T::ClassId()); }
template <typename T> const T* Cast (void) const
{ return static_cast<T*>(CastTo(T::ClassId()); }
PS:我也尝试过使用 B::ClassId() 但是我得到错误“'B'不是类或命名空间名称”,但只有当我调用派生自基时。
PS1:我不知道代码是否能按我的意愿工作,因为我还没有能够摆脱错误。
【问题讨论】:
-
这是一个非常糟糕的主意,因为调用者无法正确使用结果
-
您返回的是
void *,所以这无论如何都不能作为演员表。为什么不直接使用已经返回nullptr的dynamic_cast?实际上,在看到您的编辑后,我真的不知道您要做什么。 -
使用模板方法模式
-
@Ezra 你能解释一下你的意思吗?
-
我担心这个设计是做什么用的?如果这个层次结构增长,有多少代码被破坏并且必须更新?
标签: c++ inheritance casting static-methods dynamic-cast