2011-11-29 68 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)); 
}