2017-03-02 71 views
0

如代碼中所示,我創建了一個類Punkt(意思是德語)。這是一個array[2]類型來保存x和y軸數據。代碼還沒有完成和正確,我只是想讓它一步一步開始。 行:selfcreates class array [2]正在導致問題

bool contains (Punkt &p){ 
    Punkt ConTemp; 
    *ConTemp = &p; 

是造成問題。用codeblocks編譯給我錯誤:

no match for operator [] (operand types arr punkt and int).

問題在哪裏?

enter code here 
#include <iostream> 
#include <array> 
using namespace std; 
class Punkt { 
    public: int XYCoord [2]={}; 
    void setupCoord (int x, int y){ 
     XYCoord[0]=x; 
     XYCoord[1]=y; 
    } 
}; 
class Rechteck { 
    Punkt ReCoordLu,ReCoordRo; 

    double flaeche(double x, double y){ 
     double xy=x*y; 
     return xy; 
     } 
    bool contains (Punkt &p){ 
     Punkt ConTemp; 
     *ConTemp = &p; 

     if (ConTemp[0]>=&&ReCoordLu[0]&&ConTemp[1]>=&&ReCoordLu[1]&& 
      ConTemp[0]<=&&ReCoordRo[0]&&ConTemp[1]<=ReCoordRo[1]){ 
      return true;} 
     else{ 
      return false;} 
      }; 
    bool contains (Rechteck &){ 
     if (1){ 
      return true;} 
     else 
      return false; 
     } 
    }; 

int main() 
{ 
    /* Rechteck sharedRectangle (Rechteck a , Rechteck b){ 
     Rechteck c; 
     return Rechteck c; 
     } */ 

    Punkt P1,P2; 
    P1.setupCoord(1,1); 
    P2.setupCoord(5,5); 

    cout<<"hello"<<P2.XYCoord[0]; 

    return 0; 
}; 
+0

當然,無論你喜歡什麼,你都可以自由地命名你的類,方法和變量,但我強烈推薦@ Aziuth的建議是僅僅使用英語。 – domsson

回答

1

看來你有一些與引用和指針在一起的問題。

*ConTemp = &p; 

試圖取消引用指針,然後到一個變量的地址分配給它。 *()取消引用,&()正在獲取地址。這是沒有意義的。 ConTemp不是一個指針,因此不能被解除引用,並且你不需要p的地址。

它的工作簡單地寫

ConTemp = p; 

編輯:作爲domdom在評論所說,你可以簡單地使用P的當代,而不是在任何情況下。

要進入更詳細,以幫助您理解它:

BOOL包含(PUNKT & P);,或者我會寫它布爾包含(常量PUNKT & P)const的;被稱爲Punkt的參考。這意味着,p不是某些輸入的副本,而是相同的變量。如果p改變了,它會改變到外面。除此之外,然而,它沒有被區別對待,如果你包含(Punkt p)。不需要解引用,不需要像 - >這樣的指針語法。

解引用是指針(儘管你應該避免使用指針),如:

int a = 5; 
int* p_a = &a; //now p_a stores the address of a 
*p_a = 6; //dereference p_a and assign a new value to it 
cout << a << endl; //prints 6 

的&這裏的東西比你使用供大家參考,我想這讓你感到困惑的一個不同。你可能想重讀關於引用和指針的一些基本教程,但不要把它當作一個消息,說你在編程時會很糟糕,只是一個初學者(至少在C++中)。

編輯:正如domdom指出的,你也犯了錯誤,試圖用[]括號來訪問ConTemp。這是沒有意義的。 ConTemp是一個Punkt,Punkt沒有定義這些。您需要使用ConTemp.XYCoord [0]等等,或者在Punkt上定義該運算符。或者你只需​​與Punkt {public int x,y;}一起去。或者讓Punkt換成int [2]。我試圖避免公共成員變量,使用封裝的概念,並使其成爲一個結構,但在開始時,可​​以試用公共成員變量。建議您在某個時間點發布一些代碼進行審查。

+0

另外,他不能只是在'p'上工作,而不是先製作副本?另外,如果我沒有弄錯,'ConTemp [0]'會引起進一步的問題,不是嗎?看到他正試圖訪問一個對象,就好像它是一個數組,當他真的想訪問該對象的成員時。 – domsson

+0

@dom我認爲Punkt已經定義了[] -operator。對於一個點來說,像數組一樣存儲以訪問不同的座標是有意義的。 – Aziuth

+1

@domdom:成員的好位置 - 錯過了我的回答。 –

1

你專門請教了有關的問題,因爲你已經宣佈 ConTemp作爲Punkt - 然後你嘗試通過間接它一元*。該修補程序只是用p初始化ConTemp

bool contains (const Punkt &p){ // Better to take by const ref where possible. 
    Punkt ConTemp = p;   // Initilize 

你的測試也是可怕的混合起來。您有:

if (ConTemp[0]>=&&ReCoordLu[0]&&ConTemp[1]>=&&ReCoordLu[1]&& 
     ConTemp[0]<=&&ReCoordRo[0]&&ConTemp[1]<=ReCoordRo[1]){ 

它應該是:

if (ConTemp.XYCood[0]>=ReCoordLu.XYCood[0]&&ConTemp.XYCood[1]>=ReCoordLu.XYCood[1]&& 
     ConTemp.XYCood[0]<=ReCoordRo.XYCood[0]&&ConTemp.XYCood[1]<=ReCoordRo.XYCood[1]){ 

個人雖然,我將作爲改寫:

if (ReCoordLu.XYCood[0] <= ConTemp.XYCood[0] && 
           ConTemp.XYCood[0] <= ReCoordRo.XYCood[0] && 
     ReCoordLu.XYCood[1] <= ConTemp.XYCood[1] && 
           ConTemp.XYCood[1] <= ReCoordRo.XYCood[1]){ 

在處理多重比較,我覺得更容易閱讀,如果他們都在同一個方向。我還將XYCoord重命名爲xy。它使代碼更短。