我可以像这样投射一个阵列吗?

时间:2009-09-07 23:30:29

标签: c++ casting

示例代码:

#include <cstdlib>
#include <iostream>
using namespace std;

class A {
public:
    A(int x, int y) : x(x), y(y) {}
    int x, y;
};

class B {
public:
    operator A() {
        return A(x,y);
    }
    float x, y;
};

void func1(A a) {
    cout << "(" << a.x << "," << a.y << ")" << endl;
}

void func2(A *a, int len) {
    for(int i=0; i<len; ++i) {
        cout << "(" << a->x << "," << a->y << ")";
    }
    cout << endl;
}

int main(int argc, char** argv) {
    B b[10];
    func1(b[0]);
    //func2(b, 10);
    return(EXIT_SUCCESS);
}

func1按预期工作,但func2会引发编译时错误。我可以添加到课程B以使其工作吗?我怀疑没有,但是问起来没有坏处,对吧?

我认为它不起作用,因为A的大小与B的大小不同?

3 个答案:

答案 0 :(得分:5)

void func2(A *a, int len)

当您尝试将B类型的指针传递给func2时,无法从B*转换为A*。这些是AB两种不同的类型,但类型B有一个转换运算符,可以输入A

答案 1 :(得分:1)

将数组传递给方法时,只传递第一个元素的地址而不是数组的实际副本,也不传递第一个元素。

func1中,您传递了作为B类对象的数组的第一个元素。因为B有operator A(),它可以将B转换为A和类{的新对象{1}}传递给A

func1中,您将指针传递给B对象的数组,这些对象与A对象的数组不同,因此您会收到错误。

要解决这个问题,您可以使用一个转换方法,该方法将指针指向B和迭代器的数组,以及每个调用func2或类似的东西。

答案 2 :(得分:1)

其他答案已经解决了核心问题。但为了完整起见,值得注意的是

  

我认为它不起作用,因为   A的大小与大小不同   B?

不正确。

首先,本例中给出的A和B实际上在许多当前编译器上的大小相同。

但即使A和B的大小相同,编译器也不会自动执行这种转换。实际上,即使它们具有完全相同的成员变量内存布局,编译器仍然不会这样做。