如何在C ++中转换类型?

时间:2008-08-26 14:33:18

标签: c++ oop types

我在项目中使用了两个不同的库,它们都提供了一个基本的矩形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有同样的问题..)

EDIT2:

实际上,这些建议都没有真正回答我的实际问题,Konrad Rudolph似乎是正确的。 C ++实际上不能这样做。糟透了,但是确实如此。 (如果它有任何区别,我将按照CodingTheWheel的建议尝试子类化。

7 个答案:

答案 0 :(得分:4)

创建中间垫片类型“RectangleEx”,并定义与第三方字符串类型之间的自定义转换。无论何时使用任何API,都可以通过垫片类进行操作。

另一种方法是从classrect派生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