0

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

这听起来可能很愚蠢,但我想这样做是有原因的。我的应用程序的架构提供了抽象类componentstorage现成的应用程序将包含几个派生自的专用组件component,每个组件都将定义自己的存储类型,派生自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

所以我想知道是否有办法将 say 的指针转换PhysicsStorage*CollisionStorage*. 在这种情况下,两者都在其相关组件类的文件中定义。两者都是从 abstract 派生的Storage

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

4

1 回答 1

2

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

考虑改为将公共字段和方法推入一个新类,并拥有ComponentOneStorageComponentTwoStorage继承该类。然后,您可以将指针/引用传递给基类,这将使您可以访问公共数据,而不必在不兼容的指针类型之间进行转换。

于 2012-10-25T17:39:05.870 回答