示例代码:
#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
的大小不同?
答案 0 :(得分:5)
void func2(A *a, int len)
当您尝试将B
类型的指针传递给func2
时,无法从B*
转换为A*
。这些是A
和B
两种不同的类型,但类型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的大小相同,编译器也不会自动执行这种转换。实际上,即使它们具有完全相同的成员变量内存布局,编译器仍然不会这样做。