是否可以将对象转换为不相关的类?

时间:2012-10-25 17:36:21

标签: c++ object inheritance pointers casting

假设我有两个不同名称但结构完全相同的类。有没有办法将一个类的对象转换为另一个类的对象?

这可能听起来很愚蠢,但我有理由这样做。我的应用程序的体系结构提供了抽象类componentstorage就绪应用程序将包含从component派生的几个专用组件,并且每个组件都将定义自己的存储类型,派生自{{ 1}}。在应用程序初始化期间,对于每个组件,将创建其自定义存储类型的存储对象,并将其作为指向组件的指针传递。

这样,所有组件都保持完全独立,这对于可重用性和测试非常有用。但是,当然,需要在组件之间交换信息。为了实现这一点,我想让两个组件获得一个指向同一存储的存储指针。约束指针必须是特定于组件的存储类型。

框架代码(抽象类)

storage

示例组件

class Storage {};

class Component {
public:
    void SetStorage(Storage* storage);
private:
    Storage* storage;
};

另一个组件

class PhysicsStorage : public Storage;
class PhysicsComponent : public Component;

主要申请

class CollisionStorage : public Storage; // same structure as PhysicsStorage as both components need the same data like world coordinates and rotations of all forms in the 3d space
class CollisionComponent : public Component;

所以我想知道是否有一种方法可以将#include "system.h" PhysicsStorage Worlddata; PhysicsComponent Physics; CollisionComponent Collision; Physics.SetStorage(&Worlddata); Collision.SetStorage(&Worlddata); // this points to a PhysicsStorage but that is actually the same like a CollisionStorage which is expected 的指针投射到PhysicsStorage*。在这种情况下,两者都在其相关组件类的文件中定义。两者都来自抽象CollisionStorage*

我只想在两个自定义存储类型具有完全相同的结构的情况下这样做。否则就会毫无意义。我对进度指针的使用不太熟悉,所以我想知道是否有办法做到这一点。我所知道的是你可以投射到基类,但这不是我想要的。对两个组件使用共享存储类型会破坏独立性。非常感谢!

1 个答案:

答案 0 :(得分:2)

这可能有用,也可能没有。我相信这是一个未定义的行为,我会避免在生产代码中这样做。

相反,请考虑将公共字段和方法推送到新类中,并使ComponentOneStorageComponentTwoStorage继承该类。然后,您可以传递指向基类的指针/引用,这样您就可以访问公共数据,而无需在不兼容的指针类型之间进行转换。