我正在尝试用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
获取的值我想将它们分配给数组的对象!
答案 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
答案 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);
。
注意:setAddress
和getAddress
现在需要更新。
令人不安的另一条线是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) );
}