2009-09-07 55 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

相關問題