2009-09-07 57 views
2

示例代码:我可以像这样投射一个数组吗?

#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

是啊我也是................. – stefanB 2009-09-07 23:41:02

+0

我做到了。谢谢 – mpen 2009-09-07 23:41:22

+0

所以...我不能添加'operator * A()'? – mpen 2009-09-08 05:32:45

回答

1

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

func1传递数组的第一元件,其是类B的对象,因为B具有operator A()它可以转换到BAA的新对象被传递给func1

func2传递指针到一个B对象的数组与A对象的数组不相同,因此您会得到错误。

为了解决它,你可以有一个转换方法,它将指针指向B的数组和迭代器,并且每个调用func1或类似的东西。

+0

我想解决它,而不使用循环。我知道该怎么做。但我认为这是不可能的。谢谢 – mpen 2009-09-07 23:44:04

5
void func2(A *a, int len) 

当试图B类型的指针传递给func2存在从B*A*没有可接受的转化率。这些是AB中的两种不同类型,但B类型的转换运算符的类型为A

+0

那么这不是一个真正有效的解决方案。这个问题源于'func2'是第三方库的一部分。我想'func2'接受'A'或'B'。不过,我想你的段落回答了它。 – mpen 2009-09-08 05:29:49

1

其他答案已经解决了核心问题。但对于完整性,这是值得注意的是,

我认为它不会工作,因为 尺寸A的距离大小B 不同?

不正确。

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

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

+0

那么,我的逻辑是,它不会接受这个,因为那么指针算术不会(必然)工作。它会尽量像A一样操作,即使它是B. – mpen 2009-09-08 05:31:59

相关问题