C++在类里面定义对象数组,初始化出错,怎样解决
#include<iostream>
#include<cstdlib>
#define LEN 10
using namespace std;
struct A{
int a;
A();
A(int a=0);
};
A::A(){
}
A::A(int a){
this->a=a;
}
struct ObjArray{
A array[LEN];
int i;
ObjArray();
//~ObjArray();
};
ObjArray::ObjArray(){
for(int i=0;i<LEN;i++)array[i]=A(i);
this->i=0;
}
/*
ObjArray::~ObjArray(){
delete []array;
}*/
void main(){
ObjArray objarray();
for(int i=0;i<LEN;i++)
cout<<objarray.array[i].a<<endl;
system("pause");
}
----------vc++6.0调试信息
Compiling...
useObjArray.cpp
R:\C++Test\useObjArray.cpp(10) : warning C4520: 'A' : multiple default constructors specified
R:\C++Test\useObjArray.cpp(37) : error C2228: left of '.array' must have class/struct/union type
R:\C++Test\useObjArray.cpp(37) : error C2228: left of '.a' must have class/struct/union type
执行 cl.exe 时出错.
useObjArray.obj - 1 error(s), 0 warning(s)
[解决办法]
刚才没看仔细,把这句
ObjArray objarray();
改成这样
ObjArray objarray;
[解决办法]
ObjArray objarray(); 是声明函数
[解决办法]
对象数组的元素初始化的时候使用默认构造函数.c++11 里面支持每一个元素接受不同的初值,语法为
: A{0,1,2,3,...}
不过这个需要编译器支持.
[解决办法]
不是C++11 是一直都可以的
你想说的是 可以初始化指定元素的吧
int arr[10] = {[3]=10, [5]=8};
[解决办法]
我恰恰不是想说这个,你说的那个是 c99 的特性,不受 c++ 支持。
[解决办法]
两个问题:
1、ObjArray objarray();这样定义对象时直接ObjArray objarray;不就行了?为什么还要个括号呢?有些编译器甚至会把objarray()解释成一个函数,所以这里ObjArray objarray();修改为ObjArray objarray;
2、看看定义:
struct A{
int a;
A();
A(int a=0);
};
这里你不用任何参数来定义A时,例如:A a;这时候编译会觉得调用A()也行调用A(int a=0);也行,编译器就糊涂了,它不知道该调用哪个了。
另外,这里A(int a=0);会让A进行隐式转换的,不过这里是根据需要决定是否需要禁止隐式转换,这个问题不会报错但是一旦在大项目中开发的时候就需要特别注意这个问题了。
关于隐式转换的请看下面文章中对关键字“explicit”的解释。
http://blog.csdn.net/hjx_1000/article/details/7960579