我在项目中使用了两个不同的库,它们都提供了一个基本的矩形struct
。这个问题是似乎没有办法在类型之间插入转换,所以我不能在一个库中调用一个函数,而另一个库中的函数的结果。如果我是其中任何一个的作者,我可以从外部创建转换,但我不能。
图书馆a:
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
有同样的问题..)
实际上,这些建议都没有真正回答我的实际问题,Konrad Rudolph似乎是正确的。 C ++实际上不能这样做。糟透了,但是确实如此。 (如果它有任何区别,我将按照CodingTheWheel的建议尝试子类化。
答案 0 :(得分:4)
创建中间垫片类型“RectangleEx
”,并定义与第三方字符串类型之间的自定义转换。无论何时使用任何API,都可以通过垫片类进行操作。
另一种方法是从class
或rect
派生Rectangle
,并在那里插入转化/构造函数。
答案 1 :(得分:3)
不确定这是多么明智,但是这样的事情怎么样:
class R
{
public:
R(const rectangle& r) { ... };
R(const Rect& r) { ... };
operator rectangle() const { return ...; }
operator Rect() const { return ...; }
private:
...
};
然后你可以将每个rectangle
包裹在R()
中,并且“正确的事情”将会发生。
答案 2 :(得分:2)
如果您无法修改结构,那么您无法编写手动转换函数,因为重载转换运算符仅适用于类体。别无他法。
答案 3 :(得分:0)
在您的情况下可能不太可行,但我看到人们使用一些预处理器foo来按照类型进行兼容。
即使这假设您正在构建一个或两个库。
您可能根本不想这样做,但想要重新评估一些早期决定。或者不是。
答案 4 :(得分:0)
如果struct
内部相同,则可以执行reinterpret_cast
;但是,由于看起来你有16位和32位字段,你可能在每次调用时都没有转换,或者为其中一个库的所有函数编写包装器。
答案 5 :(得分:0)
为什么不是这样简单的事情:(注意这可能/可能不会编译)但你明白了......
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和我有同样的想法。
答案 6 :(得分:-1)
也许您可以尝试使用运算符重载? (也许a =运算符不是你班级的方法)?
Rect operator =(const Rect&,const rectangle&)
有关Bjarne Stroustrup的C ++编程语言的更多信息,或者可能在此页面上:http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html