【问题标题】:How can I convert types in C++?如何在 C++ 中转换类型?
【发布时间】:2008-08-26 14:33:17
【问题描述】:

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

我无法创建一个运算符,它从 a 获取 struct 并从 b 提供 class 的对象:

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

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

编辑:

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

编辑2:

实际上,没有一个建议能真正回答我的实际问题,Konrad Rudolph 似乎是正确的。 C++ 实际上不能做到这一点。糟透了,但确实如此。 (如果有什么不同,我将按照CodingTheWheel 的建议尝试子类化。

【问题讨论】:

    标签: c++ oop types


    【解决方案1】:

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

    另一种方法是从rectRectangle 派生class,并在其中插入转换/构造函数。

    【讨论】:

      【解决方案2】:

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

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

      然后您可以将每个rectangle 包装在R() 中,“正确的事情”就会发生。

      【讨论】:

      • 可能不是这种情况,但是 - 通常 - 具有多个未完成的隐式转换可能会导致表达式中的歧义:假设 rectangle 和 Rect 都有一个 & 运算符:假设你有 R ra , rb; ra & rb; & 操作是不明确的(可以是矩形和矩形)
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          为什么不像这样简单:(注意这可能/可能不会编译)但你明白了......

          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】:

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

            【讨论】:

              【解决方案7】:

              也许你可以试试操作符重载? (也许 = 运算符不是您的类的方法)?

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

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

              【讨论】:

              • 在 C++ 中,在类外定义 operator= 是不合法的。
              猜你喜欢
              • 2011-01-13
              • 2019-01-09
              • 2011-05-27
              • 2013-07-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-08-17
              • 1970-01-01
              相关资源
              最近更新 更多