2015-01-15 30 views
1

參數我在C很新++ althought一點在Java中有經驗,我的問題是下一個:陣列,而不在C++

我做的,我要創建一個抽象數據類型的數獨項目的盒子和董事會。在電路板之一中,我創建了一個二元組框,但是當我想將其創建爲公共數據時,我可以在整個班級中使用它,而不僅僅在電路板構造器中使用它。

我在板構造函數中創建它,因爲如果我沒有在那裏創建它,我無法知道每個維的值,並且如果我創建變量Box box[int][int],我可以在類中使用它,我無法知道尺寸。有些代碼會更好理解。

此代碼允許我創建具有我想要的尺寸的Box數組,因爲它在板構造函數中,而不是在它創建時具有作爲參數的框數,但它不允許我使用「casilla 「在課堂上,也沒有其他班的另一部分變量:

class tablero{ 

    int filas; 
    int columnas; 

public: 


    tablero (int filas, int columnas){ 

    this->filas = filas; 

    this->columnas =columnas; 
    Casilla casilla[filas][columnas]; 


    } 
    Casilla getCasilla(int n, int m){ 
     return casilla[n][m]; <- Here shows an error because casilla cannot be resolved. 

    } 

而這個其他代碼讓我用卡西利亞變量,但我必須給它的參數尺寸之前,我知道他們:

class tablero{ 

    int filas; 
    int columnas; 

public: 
    Casilla casilla[0][0]; 

    tablero (int filas, int columnas){ 

    this->filas = filas; 

    this->columnas =columnas; 



    } 
    Casilla getCasilla(int n, int m){ 
     return casilla[n][m]; 

    } 

沒有錯誤,但卡西利亞的尺寸在我認識他們之前必須先給出數組,因此他們可能是錯誤的(因爲董事會可能有不同的維度。

這是我第一次用C++進行編程,而且我對這個問題感到非常沮喪,任何人都可以幫助我找到一種方法來使它成爲雙向的方式嗎? (我已經試圖留下兩個維空,然後在構造函數中放casilla[][] = Casilla cas[filas] [columnas],但它給了我一個錯誤..)

感謝您的幫助大家。另外,如果您認爲標題不夠清楚,您可以提出建議,我會改變它。

的卡西利亞代碼是這樣一個:

類卡西利亞{

int fila; 

int columna; 

int numero; 

    public: 

     // constructor 

     Casilla(int fila, int columna,int numero) 
     { 
      this->fila = fila; 

      this->columna = columna; 

      this->numero = numero; 


     } 

};

感謝大家的回答,我已經找到了我需要的來自3個不同人的答案。我無法贊成你們所有人,因爲我仍然沒有15的聲望,但是當我擁有它時,我會讓所有人都滿意。謝謝你的答案,真的。我只需要知道我對選中的答案發表了什麼評論,並且這些答案都會得到答覆。

+2

與原始數組相比,使用'std :: vector >'。 –

+0

如果情況未知,動態內存分配是不確定的。作爲一個新手,你最好使用std :: vector,如上所示。 – IrineK

回答

2

與陣列

//---------------------------------------------------------------------------- 
#include <iostream> 
#include <iomanip> 
//---------------------------------------------------------------------------- 
class Casilla 
{ 
    int fila; 
    int columna; 
    int numero; 

    public: 

     // default constructor 
     Casilla() 
     { 
      this->fila = -1; 
      this->columna = -1; 
      this->numero = 0; 
     } 

     int GetNumero() {return numero;} 
     void SetCasilla (int _fila, int _columna) //set a cell position 
     { 
      fila = _fila; 
      columna = _columna; 
     } 
     void SetCasilla (int _numero)    //set a cell value 
     { 
      numero = _numero; 
     } 
     void SetCasilla (int _fila, int _columna, int _numero) //set a cell position and value 
     { 
      fila = _fila; 
      columna = _columna; 
      numero = _numero; 
     } 

}; 

class Tablero 
{ 
    int filas; 
    int columnas; 
    Casilla **casilla; 

public: 

    Tablero (int filas, int columnas) 
    { 
     this->filas = filas; 
     this->columnas =columnas; 
     casilla = new Casilla* [filas]; 
     for (int i = 0; i<filas; i++) 
      casilla[i] = new Casilla [columnas]; 

     for (int i = 0; i<filas; i++) 
      for (int j = 0; j<columnas; j++) 
       casilla[i][j].SetCasilla(i,j); //set the right position for each cell 
               //the values = 0 by default 
    } 

    //destructor 
    ~Tablero() 
    { 
     for (int i = 0; i<filas; i++) 
      delete [] casilla[i]; 
     delete [] casilla; 
    } 

    //set a cell value in the table 
    void ChangeCasillaValue (int _fila, int _columna, int _numero) 
    { 
     casilla[_fila][_columna].SetCasilla (_numero); 
    } 


    Casilla getCasilla(int n, int m) 
    { 
     return casilla[n][m]; 
    } 

    void PrintTablero() 
    { 
     for (int i = 0; i<filas; i++) 
     {  
      for (int j = 0; j<columnas; j++) 
        std::cout << std::setw(5)<<casilla[i][j].GetNumero(); 
      std::cout << "\n"; 
     } 
     std::cout << "\n"; 
    } 
}; 


//---------------------------------------------------------------------------- 
int main() 
{ 
    int N = 5, M = 6; 
    Tablero table(N, M); 
    table.PrintTablero(); 

    table.ChangeCasillaValue(1,1,-5); //change value in cell(1,1) 
    table.PrintTablero(); 

    std::cin.get(); 
    return 0; 
} 
//----------------------------------------------------------------------------- 

您必須添加一堆制定者和自己的干將的解決方案。 但是,作爲一個草案,它的工作原理。

+0

哇,太棒了,你能解釋一下星號嗎? 卡西亞**和卡西亞=新卡西拉,我從來沒有在代碼中找到過這種東西,我也不太瞭解。另外,我檢查你的答案,感謝E.C.Drew和Matt McNabb,這些代碼幫助我更好地理解矢量類,比我已經在網上搜索的5個「教程」要好得多。 – flaixman

+0

星號是指針。 – IrineK

0

首先Casilla casilla[filas][columnas];需要是一個類變量,因此它可以被所有方法訪問。
其次,行和列的大小必須是固定的數字,例如Casilla casilla[9][9];
如果需要動態分配,您可以使用矢量或矢量矢量。
如果它是2d數組,你仍然可以創建它作爲1d數組,但取決於哪個最適合你的目的。

+1

我唯一需要考慮的就是創建一個二維數組,它具有tablero(板)構造函數中給出的尺寸,可以在所有類和其他類中使用。有可能創建類似這樣的東西,或者我必須創建一個向量向量?我習慣於在java中使用數組,當我退出編程語言時遇到了麻煩。 – flaixman

+0

卡西利亞類的描述是必要的。 – IrineK

+0

已添加Casilla代碼。感謝大家的幫助,直到現在,我已經在研究有關C++中的向量,所以如果我必須使用它們。 – flaixman

1

在第一個例子中,在你的構造,線

Casilla casilla[filas][columnas]; 

聲明casillaCasilla數組的數組的局部對象的構造。一旦你的構造函數返回,casilla超出範圍。在你的getCasilla函數中沒有casilla成員變量或局部變量,所以當然不能解決。

在你的第二個例子中,你的班級有一個公共成員casilla,聲明爲0的Casilla對象的0數組。您的getCasilla函數將返回0乘0陣列的第n行和第m列中的項目。在C++中,沒有對數組解引用進行綁定檢查,所以這會返回一些超出內存位置的內容,並且非常糟糕。

您可以使用mallocfree自己創建動態C數組,但由於您使用的是C++,因此只需使用std::vector就會更容易。

例如,可以使用:

#include <iostream> 
#include <vector> 

class Casilla 
{}; 

class tablero 
{ 
    int filas_; 
    int columnas_; 
    std::vector<std::vector<Casilla> > casilla_; // a vector of vectors of Casillas 
public: 
    tablero(int filas, int columnas) : filas_(filas), columnas_(columnas), 
            casilla_(filas, std::vector<Casilla>(columnas)) 
    // The above is an initialization list 
    // We initialize casilla_ as a vector of filas vectors of columnas Casillas 
    {} 

    std::vector<std::vector<Casilla> > getCasilla() const 
    { 
    return casilla_; 
    } 
}; 


int main(int argc, const char* argv[]) 
{ 
    tablero t(3, 3); 

    std::cout << "casilla rows: " << t.getCasilla().size() << std::endl; 
    std::cout << "casilla cols: " << t.getCasilla()[0].size() << std::endl; 

    return 0; 
} 
2

C數組尺寸必須在編譯時在C++已知。所以沒有可以工作的Casilla casilla[filas][columnas];的變體。

相反,你應該使用一個容器,它可以容納你想要放入它的數據。不鼓勵在C++中使用C風格的數組,因爲它們有一些奇怪的行爲和規則,主要是爲了向後兼容。

最簡單的方法是一維數組大小的運行時,那個叫vector

class tablero{ 

    int filas; 
    int columnas; 
    std::vector<Casilla> casilla; 

public: 
    tablero (int filas, int columnas) 
     : filas(filas), columnas(columnas), casilla(filas * columnas) 
    { } 

    Casilla getCasilla(int f, int c) const 
    { 
     return casilla[f * columnas + c]; 
    } 
}; 

注意使用構造函數初始化列表。您應該以這種方式爲類成員提供初始值,而不是在構造函數中使用賦值語句。