2010-11-19 119 views
0

我为我的C++项目使用Chipmunk物理引擎。C++:使用另一种类型

花栗鼠有它自己的向量,cpVect,这不过是一个struct { double x, y; };

不过我有自己的操作重载Vector类在我的项目 - 我想用它就像一个cpVect和副反之亦然,而无需任何转换 (我class Vector唯一的数据字段double x, y以及)

目前我使用这个隐式转换(参数传递,一个Vector变量设置为cpVect等)

inline operator cpVect() { return cpv(x, y); }; 
inline Vector(cpVect v) : x(v.x), y(v.y) {} 

这适用于大多数情况,但有一些问题 - 例如,它与使用cpVect数组的Vector类型的数组不兼容。

对于我现在必须这样做:

Vector arrayA[123]; 
cpVect* arrayB = (cpVect*) arrayA; 
  • 是否有可能通过某种方式使用我的向量作为cpVect,反之亦然?数据与两个结构相同,我的只有其他方法。
+1

这里有什么问题? – Eclipse 2010-11-19 21:29:30

+0

固定,哈哈。对不起, – Alfred 2010-11-19 21:32:23

+0

也许使用工会? – 2010-11-19 21:33:09

回答

2

所以,如果我理解你,你有这样的:

class Foo 
{ 
    double x, y; 
}; 

class Bar 
{ 
    double x, y; 
}; 

...你想pretened一个Foo实际上是一个Bar,对不对?

你不能 - 没有唤起Undefined Behavior。无论你尝试什么,你都会陷入伟大的UB黑洞。

  • 如果您尝试使用一个联盟,你会唤起UB当你分配到my_union.foo,并从my_union.bar
  • 读,如果你尝试reinterpret_cast你会唤起UB时尝试使用铸造指针
  • 如果您尝试使用C风格的演员,你有同样的问题如上

问题是这样的:尽管FooBar相同,他们不一样。就C++而言,它们是完全不同的类型,完全不相关。这是一件好事,但它也可能会产生一些似乎是人为和任意的障碍。

所以,为了做到这一点而不唤起UB,你需要转换。你可以把这个几乎是自动,通过简单地添加一对夫妇的设施Bar(这我相信是一个你写的,而不是一个从库):

class Bar 
{ 
public: 
    Bar(const Foo& foo) : x(foo.x), y(foo.y) {}; // lets you convert from Foo to Bar 
    Bar& operator=(const Foo& foo) { x = foo.x; y = foo.y; return * this; } 

    operator Foo() const { Foo ret; ret.x = x; ret.y = y; return ret; } // lets you convert ffrom Bar to Foo 
private: 
    double x, y; 
}; 

这将让你从FooBar去并返回很少或没有代码。另外,编译器会在发布版本中优化大量的这些。

+0

他正在尝试从数组到数组(或至少是'vec *')的转换以及单个对象转换。为了准确显示为什么它是UB。 – 2010-11-19 21:58:23

+0

@Mark:他不能没有转换。 – 2010-11-19 22:01:07

+0

我可以,而且我已经做了(cpVect *)someArrayOfVector; – Alfred 2010-11-19 22:11:18

0

如果这两个都是简单的POD(没有虚拟功能等),那么简单的reinterpret_cast可以把你保存在这里。

+0

不是没有唤起UB – 2010-11-19 21:57:58

+0

不同意。该标准提到重新解释转换的结果是“实现定义的”,它不是*“与undefined”相同的东西 - 请参阅http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-定义行为。 – Kos 2010-11-20 05:23:32

0

从他们的衍生你的问题,并解决问题?似乎很简单,有1000个陷阱。 :)

相关问题