2014-01-17 38 views
0

我有一個小問題,此代碼:鑄造用C'tor不起作用

#include <iostream> 
using namespace std;  

class Array 
{ 
    public: 
     int* Arr; 
     int size; 

     Array(); 
    Array(const Array& A) 
    { 
     size = A.size; 
     Arr = new int[size]; 

     for (int i=0; i < size; i++) 
     { 
      Arr[i] = A.Arr[i]; 
     } 
    } 

    Array(int size) { Arr = new int[size]; } 

    Array(int* A): size(5) // takes only 5 arguments from A 
    { 
     Arr = new int[size]; 

     for (int i=0; i < size; i++) 
     { 
      Arr[i] = A[i]; 
     } 
    } 
}; 


Array& operator+ (const Array& A , int* B) 
{ 
    Array *Res = new Array(A); 
    Res->size = A.size*2; 

    for (int i=A.size; i < Res->size; i++) 
     { 
      Res->Arr[i] = B[i - A.size ]; 
     } 

    return *Res; 
} 


void main() 
{ 
    int A[] = {0,1,2,3,4} , *B; 

    B = new int[5]; 

    for(int i=0; i<5; i++) 
    { 
     B[i] = i+5; 
    } 

    Array Res = Array(A) + B;   // Using temporary object works 
    Array Res = ((Array)A) + B;  // Forced cast also works good 
    Array Res1 = A + B;    // Automatic casting won't work, why? 
} 

最後一行不起作用,即使我實現了Array(int* A)鑄造C'tor

它說:

error C2110: '+' : cannot add two pointers 

可能是什麼問題?

+0

編譯器不知道在處理int []和int *'時應該使用Array類。 –

+0

不要使用'void main',總是使用'int main' – Ajay

回答

0

你期望編譯器知道它應該使用:

Array& operator+ (const Array& A , int* B)

但是第一個操作數(A)不是Array類型的變量。

因此,編譯器無法解析'+'操作。

+0

運算符+期望得到Array + int [],而是得到int [] + int []。因爲C'tor數組(int * A)不是顯式的,所以期望它會使用Array(int * A)C'tor創建一個臨時數組對象。 我該如何讓它工作呢?關鍵是連接兩個int []類型的變量 – user3208495

+0

您希望編譯器查看整個程序中的每個類,希望可能在某處有一個類可以從int *構建,並且b)提供'運營商+'。編譯器不會發揮如此英勇的努力。表達式'A + B'沒有提及任何形狀或形式的'Array'類;沒有什麼建議編譯器應該考慮'Array',所以編譯器不會考慮它。 –

+0

@IgorTandetnik實際上,由於'operator +'不是成員函數,所以規則有點不同。如果'Array'可以從一個自定義的'struct S'構造,那麼'S()+ B'就可以工作。只是因爲指針是內置類型(更確切地說,因爲內置類型沒有關聯的名稱空間),所以它不會。 – hvd

2

如果按照運算符優先順序和執行順序進行操作,您將理解爲什麼。對於這個簡單的語句:

r=a+b; 

表達a+b將首先執行,然後該表達式的結果將用於=運算符。這不是相反的方式。它是評價是這樣的:

(r=a)+b; 

但作爲:

r=(a+b); 

因此,的a+b結果類型將應用到r=表達。在你的情況下,你期望r=首先執行,但這是錯誤的!在你的情況下,ab都是指針,而C/C++不允許添加兩個指針。

+0

當你發佈時,我正在寫同樣的東西! – Julian

+1

這真的錯過了問題的重點。 '數組Res1 =運算符+(A,B);'會工作。 '數組Res1 = A + B;'不起作用。你說這是因爲OP期望它被視爲'(Array Res1 = A)+ B;'(甚至不是有效的)?我非常懷疑這一點。 – hvd

+0

不,不,不! 'operator +(A,B)'也行不通!兩者都是本地類型,您不能重載operator +,其中二元參數都是本地的。 – Ajay