题
我在我的项目中使用两个不同的库,它们都提供一个基本的矩形 struct
. 。问题在于,似乎无法在类型之间插入转换,因此我无法使用另一个库中函数的结果来调用一个库中的函数。如果我是其中任何一个的作者,我可以从外部创建转换,但我不能。
库一:
typedef struct rectangle { sint16 x; sint16 y; uint16 w; uint16 h; } rectangle;
库b:
class Rect {
int x; int y; int width; int height;
/* ... */
};
现在,我无法制作转换器 class
, ,因为 C++ 只会在一步中查找转换。这可能是一件好事,因为有很多可能性涉及创建各种类型的新对象。
我无法创建一个可以接受的运算符 struct
从 a
并提供一个对象 class
从 b
:
foo.cpp:123 error: ‘operator b::Rect(const rectangle&)’ must be a nonstatic member function
那么,有没有一种明智的方法可以解决这个问题呢?
编辑:
我也许还应该指出,我真的很喜欢一些可以无缝处理结果的解决方案,因为我不希望成为那个编码员。(尽管我同意,老派的、明确的、转换将是一个不错的选择。另一个分支, reinterpret_cast
有同样的问题..)
编辑2:
事实上,这些建议都没有真正回答我的实际问题, 康拉德·鲁道夫 似乎是正确的。C++实际上做不到这一点。很糟糕,但确实如此。(如果有什么区别,我将尝试按照建议进行子类化 编码轮.
解决方案
如果您无法修改结构,那么您就别无选择,只能编写手动转换函数,因为重载转换运算符只能在类体内起作用。没有其他办法了。
其他提示
创建中间垫片类型“RectangleEx
",并定义与第 3 方字符串类型之间的自定义转换。每当您使用任一 API 时,请通过 shim 类进行操作。
另一种方法是导出 class
从任一 rect
或者 Rectangle
, ,并在那里插入转换/构造函数。
不确定这有多明智,但是这样的事情怎么样:
class R
{
public:
R(const rectangle& r) { ... };
R(const Rect& r) { ... };
operator rectangle() const { return ...; }
operator Rect() const { return ...; }
private:
...
};
然后你就可以把每一个包裹起来 rectangle
在 R()
“正确的事情”将会发生。
对于您的情况来说,这可能不可行,但我见过人们使用一些预处理器 foo 来调整类型以使其兼容。
即使这样,也假设您正在构建一个或两个库。
也有可能您根本不想这样做,但想重新评估一些早期的决定。或不。
为什么不做一些像这样简单的事情:(注意这可能/可能不会编译)但你明白了......
private Rect* convert(const rectangle& src)
{
return new Rect(src.x,src.y,src.w,src.h);
}
int main()
{
rectangle r;
r.x = 1;
r.y = 2;
r.w = 3;
r.h = 4;
Rect* foo = convert(&r);
...
delete foo;
}
编辑: 看来我和koko的想法是一样的。
如果 struct
内部是相同的,你可以做一个 reinterpret_cast
;但是,由于看起来您有 16 位字段与 32 位字段,因此您可能会在每次调用时进行转换,或者为其中一个库的所有函数编写包装器。
也许你可以尝试使用运算符重载?(也许 = 运算符不是您的类的方法)?
矩形运算符=(常量矩形&,常量矩形&)
有关此内容的更多信息,请参见 Bjarne Stroustrup 的 C++ 编程语言,或者可能在此页面上: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html