0

我在我的项目中使用了两个不同的库,它们都提供了一个基本的 rectangle 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++ 只会一步一步地寻找转换。这可能是一件好事,因为有很多可能性涉及创建各种类型的新对象。

我不能制作一个接受structfroma并提供 from 对象的class运算符b

foo.cpp:123 错误:'operator b::Rect(const rectangle&)' 必须是非静态成员函数

那么,有没有一种明智的方法来解决这个问题?

编辑:

我或许还应该指出,我真的很想要一些可以无缝处理结果的解决方案,因为我不希望成为那个编码员。(虽然我同意,老式的、明确的、转换会是一个不错的选择。另一个分支reinterpret_cast也有同样的问题..)

编辑2:

实际上,这些建议都没有真正回答我的实际问题,康拉德鲁道夫似乎是正确的。C++ 实际上不能做到这一点。糟透了,但确实如此。(如果有什么不同,我将尝试按照CodingTheWheel的建议进行子类化。

4

7 答案 7

4

创建中间 shim 类型“ RectangleEx”,并定义与第 3 方字符串类型之间的自定义转换。每当您使用任一 API 时,请通过 shim 类进行。

另一种方法是classrector派生 a Rectangle,并在那里插入转换/构造函数。

于 2008-08-26T14:44:41.257 回答
3

不知道这是多么明智,但这样的事情怎么样:

class R
{
public:
    R(const rectangle& r) { ... };
    R(const Rect& r) { ... };

    operator rectangle() const { return ...; }
    operator Rect() const { return ...; }

private:
    ...
};

然后你可以把所有rectangle的东西都包起来R(),“正确的事情”就会发生。

于 2008-08-26T14:49:01.057 回答
2

如果您无法修改结构,那么您别无选择,只能编写手动转换函数,因为重载转换运算符仅在类主体中起作用。没有别的办法。

于 2008-08-26T14:48:00.420 回答
0

在您的情况下这可能不可行,但我看到人们使用一点预处理器来将类型按摩到兼容性。

即使这假设您正在构建一个或两个库。

您也可能根本不想这样做,但想重新评估一些早期决定。或不。

于 2008-08-26T14:37:28.167 回答
0

如果structs 在内部是相同的,你可以做一个reinterpret_cast; 但是,由于看起来您有 16 位和 32 位字段,因此您可能会在每次调用时卡住转​​换,或者为其中一个库的所有函数编写包装器。

于 2008-08-26T14:38:11.800 回答
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's 和我有同样的想法。

于 2008-08-26T14:41:26.380 回答
-1

也许您可以尝试使用运算符重载?(也许 = 运算符不是您类的方法)?

矩形运算符= (const Rect&,const rectangle&)

Bjarne Stroustrup 在 C++ 编程语言中的更多信息,或者在这个页面上:http ://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

于 2008-08-26T14:44:27.200 回答