2011-11-29 70 views
3

我試圖在C++中創建一個應用程序。在應用程序中,我有默認的構造函數和另外一個帶3個參數的構造函數。 用戶從鍵盤提供一個整數,它將用於使用非默認構造函數創建對象數組。 不幸的是,直到現在我還沒能完成它,因爲我在創建對象數組時會遇到問題,因此他們將使用非默認構造函數。 任何建議或幫助?構造函數和C++中的對象數組

#include<iostream> 
#include<cstring> 
#include<cstdlib> 
#include <sstream> 

using namespace std; 

class Station{ 

public: 
    Station(); 
    Station(int c, char *ad, float a[]);  
    ~Station(); 


    void setAddress(char * addr){ 

     char* a; 
     a = (char *)(malloc(sizeof(addr+1))); 
     strcpy(a,addr); 
     this->address = a; 
    } 

    void setCode(int c){ 
     code=c; 
    } 

    char getAddress(){ 
     return *address; 
    } 

    int getCode(){ 
     return code; 
    } 


    float getTotalAmount(){ 
     float totalAmount=0; 
     for(int i=0;i<4;i++){ 
      totalAmount+=amount[i]; 
     } 
     return totalAmount; 
    } 

    void print(){ 

     cout<<"Code:"<<code<<endl; 
     cout<<"Address:"<<address<<endl; 
     cout<<"Total Amount:"<<getTotalAmount()<<endl; 
     cout<<endl; 
    } 


private: 
    int code; 
    char *address; 
    float amount[4]; 

}; 


Station::Station(){ 
    code= 1; 
    setAddress("NO ADDRESS GIVEN"); 
    amount[0]= 0.0; 
    amount[1]= 0.0; 
    amount[2]= 0.0; 
    amount[3]= 0.0; 

} 


Station::Station(int c, char *ad, float a[]){ 

    if((c>=1&& c<=10)){ 
     code=c; 
     address=ad; 

     for(int i=0;i<4;i++){ 
      amount[i]=a[i]; 
     } 

    }else{ 

     code= 1; 

     setAddress("NO ADDRESS GIVEN"); 
     amount[0]= 0.0; 
     amount[1]= 0.0; 
     amount[2]= 0.0; 
     amount[3]= 0.0; 
    } 
} 


Station::~Station(){ 

} 

int main(){ 

    int size,code; 
    char *addrr; 
    addrr = (char *)(malloc(sizeof(addrr+1))); 
    float mes[4]; 

    do{ 
     cout<<"size of array:"; 
     cin>>size; 

    }while(size<=0 || size>=11); 

    // Station *stations= new Station[size]; 
    // Station** stations = new Station*[size]; 
    Station stations[size]; 

    for(int i=0;i<size;i++){ 

     cout<<"code:"; 
     cin>>code; 

     cout<<"address:"; 
     cin>>addrr; 

     double amo=0; 

     for(int k=0;k<4;k++){ 
      cout<<"values"<<k+1<<":"; 
      cin>>mes[k]; 
     } 
    } 
    /* 
    for(int q=0;q<size;q++){ 
     stations[q].print(); 
    } 
    */ 

    return 0; 
} 

我將從cin獲取的值我想將它們分配給數組的對象!

+0

給我們一些代碼... –

+1

HTTP ://mattgemmell.com/2008/12/08/what-have-you-tried/ – FailedDev

+0

顯示數組的創建,你使用new或malloc? – LostMohican

回答

11

您可以創建一個數組默認初始化,然後填充通緝對象數組:

foo arr[10]; 
std::fill(arr, arr+10, foo(some, params)); 

另外,您可以使用std::vector而且只做:

std::vector<foo> arr(10, foo(some, params)); 
2

在C++ 0x,您可以在新表達式中使用braced-init-list,這意味着您可以這樣做:

#include <iostream> 

class A 
{ 
public: 
    A(int i, int j){std::cout<<i<<" "<<j<<'\n';} 
}; 

int main(int argc, char ** argv) 
{ 
    int *n = new int[3]{1,2,3}; 
    A *a = new A[3]{{1,2},{3,4},{5,6}}; 
    delete[] a; 
    delete[] n; 
    return 0; 
} 

使用g ++ 4.5.2進行編譯,使用g++ -Wall -std=c++0x -pedantic

0

既然你說你不能使用std::string,這將會困難得多。行addrr = (char *)(malloc(sizeof(addrr+1)));沒有做你認爲的事情。如果我們使用malloc在堆上分配,並且由於沒有free(這將導致內存泄漏),而不是使用malloc,如果我們使用預定的緩衝區大小在堆棧上分配,將會容易得多:char addrr[BUFFER_LENGTH]。在Station的聲明之前定義的BUFFER_LENGTH定義爲const int BUFFER_LENGTH = 20;或其他適當的長度。

要使用非默認構造函數,在for循環結尾處添加stations[i] = Station(c, addrr, mes);將執行此操作。

for(int i=0;i<size;i++){ 
    cout<<"code:"; 
    cin>>code; 

    cout<<"address:"; 
    cin>>addrr; // do not read in strings longer than 20 characters or increase BUFFER_LENGTH’s size 

    double amo=0; 

    for(int k=0;k<4;k++){ 
     cout<<"values"<<k+1<<":"; 
     cin>>mes[k]; 
    } 

    stations[i] = Station(c, addrr, mes); 
} 

但是,這不會因爲構造函數複製addrr指針,而非數據才能正常工作。我還會建議將數據成員char *address更改爲char address[BUFFER_LENGTH]。然後,在構造函數中,您可以用strcpy(address, ad);替換address=ad;這一行。

注意:現在需要更新setAddressgetAddress。另一個令人不安的線是Station stations[size];。這是非標準的,因爲size在編譯時不是已知的。要麼使用Station *stations= new Station[size];並記住delete,或者您可以使用一個std::vector,使用std::vector<Station> stations(size);

如果你去std::vector路線,使用push_back將很好地工作:

std::vector<Station> stations; 

for(int i=0;i<size;i++){ 

    cout<<"code:"; 
    cin>>code; 

    cout<<"address:"; 
    cin>>addrr; 

    double amo=0; 

    for(int k=0;k<4;k++){ 
     cout<<"values"<<k+1<<":"; 
     cin>>mes[k]; 
    } 

    stations.push_back(Station(c, addrr, mes)); 
}