C ++传递的类型与另一种类型相同

时间:2015-03-14 11:44:27

标签: c++

有人可以回答这个问题吗?

以下代码将比我的尴尬问题更好地突出问题。

struct vector2d
{
    float x,y;
};

struct point2d
{
    float x, y;
}

void drawpoint(point2d point);

int main()
{
    vector2d vec = {100, 100};
    drawpoint(vec);
}

void drawpoint(point2d point)
{
    ...
}    

我想知道为什么这不起作用。另一种方法是通过中间堆point2d变量手动转换类型,但是编译器会看到这个并且知道那不是必要的吗?

这可能是我在这里错过的非常简单的事情,提前谢谢。

5 个答案:

答案 0 :(得分:1)

编译器正在通过不转换所有类型来帮助你。假设您有一个Rectangle班级,宽度和身高float,以及PatientInformation班级,身高和体重float。如果传递错误的类型,你真的希望编译器无形地转换它吗?

请注意,以下代码可以正常工作:

int main()
{
    vector2d vec = {100, 100};
    drawpoint(reinterpret_cast<point2d const&>(vec));
}

但是,这里适当的解决方案是使用类型更清洁。对于传递给drawpoint的向量,它没有 sense ,只不过将一个点传递给moveBy是有意义的。考虑类型,而不是成员。

答案 1 :(得分:1)

point2d pnt;
memcpy(&pnt, &vec, sizeof(pnt));
drawpoint(pnt);

point2d pnt = { vec.x, vec.y };
drawpoint(pnt);

drawpoint(point2d{vec.x, vec.y});

drawpoint(*(const point2d*)&vec); // UB, but will work on many implementations

答案 2 :(得分:0)

你不能,你必须这样:

void main
{
vector2d vec = {100, 100};

point2d p;
p.x = vec.x;
p.y = vec.y;

Drawpoint(p);

}

答案 3 :(得分:0)

你有一堆小的语法问题,你是否尝试编译它。

  Struct, Void, and Float  

不应该大写

  Void main

应该是       int main()

但最重要的是你已经定义了Drawpoint()来将Vector2D作为参数,并且你试图将它传递给point2d。 C ++是类型安全的,不会让你只用一种类型替换另一种类型。

答案 4 :(得分:0)

您可以创建基类:

struct XY{
  float x;
  float y;
};

然后

struct vector2D: XY{
};

struct point2D: XY{
};

void drawPoint(XY& xy){
}