C ++中的构造函数和对象数组

时间:2011-11-29 14:05:22

标签: c++

我正在尝试用C ++创建一个应用程序。在应用程序中,我有默认构造函数和另一个带有3个参数的构造函数。 用户从键盘提供一个整数,它将用于使用非默认构造函数创建对象数组。 不幸的是,到目前为止我还没有完成它,因为我遇到了创建对象数组的问题,他们将使用非默认构造函数。 有什么建议或帮助吗?

#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获取的值我想将它们分配给数组的对象!

3 个答案:

答案 0 :(得分:11)

您可以创建默认初始化的数组,然后使用想要的对象填充数组:

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

或者您可以使用std::vector并执行:

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

答案 1 :(得分: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++ -Wall -std=c++0x -pedantic

在g ++ 4.5.2下编译

答案 2 :(得分:0)

由于您说您无法使用std::string,因此这将变得更加困难。 addrr = (char *)(malloc(sizeof(addrr+1)));行没有按照您的想法行事。而不是使用malloc在堆上分配,因为没有free(这将导致内存泄漏),如果我们使用预定的缓冲区大小分配堆栈将更容易: char addrr[BUFFER_LENGTH]。在BUFFER_LENGTH声明为Station或其他适当长度之前定义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]。然后,在构造函数中,您可以将行address=ad;替换为strcpy(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) );
}