我已经阅读了几个关于C++动态转换的线程,所有人都声称它表明设计不好.在其他语言中,我在检查对象的类型时从未考虑过太多.我从不使用它作为多态性的替代,只有当强耦合看起来完全可以接受时.我经常遇到的这些情况之一:有一个列表(我在C++中使用std :: vector)的对象,都是从一个公共基类派生的.该列表由一个允许知道不同子类的对象管理(通常它是管理对象类中私有类的一个小层次).通过将它们保存在单个列表(数组,向量,...)中,我仍然可以从多态中受益,但是当一个操作意图作用于特定子类的对象时,我使用动态转换或类似的东西.
如果没有我缺少的动态强制转换或类型检查,是否存在针对此类问题的不同方法?我真的好奇那些不惜一切代价避免这些的程序员会如何处理它们.
如果我的描述过于抽象,我可以在C++中编写一个简单的例子(编辑:见下文).
class EntityContacts {
private:
class EntityContact {
private:
virtual void someVirtualFunction() { }; // Only there to make dynamic_cast work
public:
b2Contact* m_contactData;
};
class InternalEntityContact : public EntityContact {
public:
InternalEntityContact(b2Fixture* fixture1, b2Fixture* fixture2){
m_internalFixture1 = fixture1;
m_internalFixture2 = fixture2;
};
b2Fixture* m_internalFixture1;
b2Fixture* m_internalFixture2;
};
class ExternalEntityContact : public EntityContact {
public:
ExternalEntityContact(b2Fixture* internalFixture, b2Fixture* externalFixture){
m_internalFixture = internalFixture;
m_externalFixture = externalFixture;
};
b2Fixture* m_internalFixture;
b2Fixture* m_externalFixture;
};
PhysicsEntity* m_entity;
std::vector<EntityContact*> m_contacts;
public: …Run Code Online (Sandbox Code Playgroud) 我最近开始研究iOS游戏,并决定用C++编写项目的一个独特部分.只要Objective C类只是访问某些成员或调用C++对象上的函数,这种方法似乎工作正常.但是我似乎找不到一种优雅的方法来让我的Objective C类响应C++类中的'events'.任何使用回调的事件处理系统似乎都是不可能的(因为Objective C方法和C++函数可能不可互换).我能想到的是使用委托模式和围绕我的C++委托类编写包装类,以便我可以在Objective C代码中使用它们.所以我的问题是:有更好的方法吗?
注意:我想防止在我的C++文件中直接使用Objective C,因为这些类应该是独立于平台的.