类数组的初始化

时间:2021-09-05 19:50:10
如果类的对象是数组,而且我想在声明的时候调用自己写的带参数的构造函数,那我应该怎么声明这个数组

class Vector
{
float v[4];
friend class vectorContainer;
public:
Vector(float ve[4])
{
for ( int i = 0 ; i < 4 ; i++ )
v[i] = ve [i];
}
Vector()
{
for ( int i = 0 ; i < 4 ; i++ )
v[i] = 0;
}
~Vector(){}
void output();
};

比如这个,我要声明一个Vector类的数组,那应该怎么声明

14 个解决方案

#1


数组会调用默认的构造函数。

所以考虑用另一种方式。
声明一个类对象的指针数组。

然后循环遍历这个数组,一次手动调用 带参数的构造函数。得到的对象指针放到数组里

#2


引用 1 楼 wuyu637 的回复:
数组会调用默认的构造函数。

所以考虑用另一种方式。
声明一个类对象的指针数组。

然后循环遍历这个数组,一次手动调用 带参数的构造函数。得到的对象指针放到数组里

能不能举个例子

#3



Vector* CC[NUM];
for(int i = 0; i!= NUM; i++)
{
  CC[i]->Vector(float ve[4]);
}


这是LS的意思

但是LZ你举的例子,应该这样理解

你重载了构造函数

而且重写了默认构造函数

按照你的意思用上面的代码就可以了

若果你在头文件中声明
Vector m_CC[NUM];


然后再源文件中的其它对象类的构造函数的初始化列表中调用重载构造函数也是可以的
eg.


BB BB():m_CC[0](ve[4])),.....
{

}

#4


我所列举的后一种应用情况是你在其他类中使用Vector对象作为数据成员

Vector m_CC[NUM];

#5


3楼你好,如果按你写的调用重载构造函数,也初始化列表写的不是规定了你的数组的维数吗?但是实际上我不知道我的类对象数组是多大的

#6



Vector* CC[NUM];
for(int i = 0; i!= NUM; i++)
{
  CC[i]->Vector(float ve[4]);
}

这个代码通不过编译的,“函数样式转换”: 位于“->”运算符右边时非法

#7


#include <iostream>

class Vector
{
    float v[4];
    friend class vectorContainer;
public:
    Vector(float ve[4])
    {
        for ( int i = 0 ; i < 4 ; i++ )
            v[i] = ve [i];
    }
    Vector()
    {
        for ( int i = 0 ; i < 4 ; i++ )
            v[i] = 0;
    }
    ~Vector(){}
    void output(){
// 这里只是测试输出数组中的第二个元素看看
std::cout<<v[1]<<std::endl;
}
};

int main(){
Vector* array=new Vector[4];
array[3].output();
float ve[4]={3.1,3.2,3.3,3.4};
Vector one(ve); //这里使用了重载的构造函数
array[2]=one; //给array数组中第三个元素重新赋值
array[2].output(); //输出rray数组中第三个元素中第二个元素的值

return 0;
}
看看这个。

#8


引用楼主 dalookzhu 的回复:
如果类的对象是数组,而且我想在声明的时候调用自己写的带参数的构造函数,那我应该怎么声明这个数组
C/C++ code

class Vector
{
    float v[4];
    friend class vectorContainer;
public:
    Vector(float ve[4])
    {
        for ( int i = 0 ; i < 4 ; i……
用std::vector啊,不过ms你自己在写vector,哈哈
#define NUM 2
#include <iostream>
#include <vector>
using namespace std;

class Vector
{
    float v[4];
    friend class vectorContainer;
public:
    Vector(float ve[4])
    {
        for ( int i = 0 ; i < 4 ; i++ )
            v[i] = ve [i];
    }
    Vector()
    {
        for ( int i = 0 ; i < 4 ; i++ )
            v[i] = 0;
    }
    ~Vector(){}
    void output();
};

void Vector::output()
{
for(int i=0; i!=4;++i)
{
cout<<v[i];
}
cout<<"\n";
}

int main () {

float f[4]={0,1,2,3};
Vector v(f);
vector<Vector> pvv(NUM,v); 
for(vector<Vector>::iterator i= pvv.begin();i!=pvv.end();++i)
{
i->output();
}
return 0;
}

#9


各位大牛!!照顾一下我。。我只是初学的

#10


引用 7 楼 cumirror 的回复:
#include <iostream>

class Vector
{
  float v[4];
  friend class vectorContainer;
public:
  Vector(float ve[4])
  {
  for ( int i = 0 ; i < 4 ; i++ )
  v[i] = ve [i];
  }
  Vector()
  {
……


你好。这种方法我知道,就是先初始化后赋值。我就是想问有没有别的方法。。

#11


引用 5 楼 dalookzhu 的回复:
3楼你好,如果按你写的调用重载构造函数,也初始化列表写的不是规定了你的数组的维数吗?但是实际上我不知道我的类对象数组是多大的


既然是数组,你应该知道大小的

如果真的不知道

那就得用容器了

而不是数组那么简单了

#12



Vector* CC = new Vector(NUM);
for(int i = 0; i!= NUM; i++)
{
  CC[i]->Vector(float ve[4]);
}

引用 6 楼 dalookzhu 的回复:
C/C++ code

Vector* CC[NUM];
for(int i = 0; i!= NUM; i++)
{
  CC[i]->Vector(float ve[4]);
}


这个代码通不过编译的,“函数样式转换”: 位于“->”运算符右边时非法



#13



#include <vector>

vector<Vector> vv;//容器对象

Vector a(ve[4]);//调用默认或重载构造函数

vv.push_back(a);//添加容器元素



#14


虽然得不到我要的答案(可能是我表达不清楚吧),但是还是非常感谢大家了。就此结贴了。

#1


数组会调用默认的构造函数。

所以考虑用另一种方式。
声明一个类对象的指针数组。

然后循环遍历这个数组,一次手动调用 带参数的构造函数。得到的对象指针放到数组里

#2


引用 1 楼 wuyu637 的回复:
数组会调用默认的构造函数。

所以考虑用另一种方式。
声明一个类对象的指针数组。

然后循环遍历这个数组,一次手动调用 带参数的构造函数。得到的对象指针放到数组里

能不能举个例子

#3



Vector* CC[NUM];
for(int i = 0; i!= NUM; i++)
{
  CC[i]->Vector(float ve[4]);
}


这是LS的意思

但是LZ你举的例子,应该这样理解

你重载了构造函数

而且重写了默认构造函数

按照你的意思用上面的代码就可以了

若果你在头文件中声明
Vector m_CC[NUM];


然后再源文件中的其它对象类的构造函数的初始化列表中调用重载构造函数也是可以的
eg.


BB BB():m_CC[0](ve[4])),.....
{

}

#4


我所列举的后一种应用情况是你在其他类中使用Vector对象作为数据成员

Vector m_CC[NUM];

#5


3楼你好,如果按你写的调用重载构造函数,也初始化列表写的不是规定了你的数组的维数吗?但是实际上我不知道我的类对象数组是多大的

#6



Vector* CC[NUM];
for(int i = 0; i!= NUM; i++)
{
  CC[i]->Vector(float ve[4]);
}

这个代码通不过编译的,“函数样式转换”: 位于“->”运算符右边时非法

#7


#include <iostream>

class Vector
{
    float v[4];
    friend class vectorContainer;
public:
    Vector(float ve[4])
    {
        for ( int i = 0 ; i < 4 ; i++ )
            v[i] = ve [i];
    }
    Vector()
    {
        for ( int i = 0 ; i < 4 ; i++ )
            v[i] = 0;
    }
    ~Vector(){}
    void output(){
// 这里只是测试输出数组中的第二个元素看看
std::cout<<v[1]<<std::endl;
}
};

int main(){
Vector* array=new Vector[4];
array[3].output();
float ve[4]={3.1,3.2,3.3,3.4};
Vector one(ve); //这里使用了重载的构造函数
array[2]=one; //给array数组中第三个元素重新赋值
array[2].output(); //输出rray数组中第三个元素中第二个元素的值

return 0;
}
看看这个。

#8


引用楼主 dalookzhu 的回复:
如果类的对象是数组,而且我想在声明的时候调用自己写的带参数的构造函数,那我应该怎么声明这个数组
C/C++ code

class Vector
{
    float v[4];
    friend class vectorContainer;
public:
    Vector(float ve[4])
    {
        for ( int i = 0 ; i < 4 ; i……
用std::vector啊,不过ms你自己在写vector,哈哈
#define NUM 2
#include <iostream>
#include <vector>
using namespace std;

class Vector
{
    float v[4];
    friend class vectorContainer;
public:
    Vector(float ve[4])
    {
        for ( int i = 0 ; i < 4 ; i++ )
            v[i] = ve [i];
    }
    Vector()
    {
        for ( int i = 0 ; i < 4 ; i++ )
            v[i] = 0;
    }
    ~Vector(){}
    void output();
};

void Vector::output()
{
for(int i=0; i!=4;++i)
{
cout<<v[i];
}
cout<<"\n";
}

int main () {

float f[4]={0,1,2,3};
Vector v(f);
vector<Vector> pvv(NUM,v); 
for(vector<Vector>::iterator i= pvv.begin();i!=pvv.end();++i)
{
i->output();
}
return 0;
}

#9


各位大牛!!照顾一下我。。我只是初学的

#10


引用 7 楼 cumirror 的回复:
#include <iostream>

class Vector
{
  float v[4];
  friend class vectorContainer;
public:
  Vector(float ve[4])
  {
  for ( int i = 0 ; i < 4 ; i++ )
  v[i] = ve [i];
  }
  Vector()
  {
……


你好。这种方法我知道,就是先初始化后赋值。我就是想问有没有别的方法。。

#11


引用 5 楼 dalookzhu 的回复:
3楼你好,如果按你写的调用重载构造函数,也初始化列表写的不是规定了你的数组的维数吗?但是实际上我不知道我的类对象数组是多大的


既然是数组,你应该知道大小的

如果真的不知道

那就得用容器了

而不是数组那么简单了

#12



Vector* CC = new Vector(NUM);
for(int i = 0; i!= NUM; i++)
{
  CC[i]->Vector(float ve[4]);
}

引用 6 楼 dalookzhu 的回复:
C/C++ code

Vector* CC[NUM];
for(int i = 0; i!= NUM; i++)
{
  CC[i]->Vector(float ve[4]);
}


这个代码通不过编译的,“函数样式转换”: 位于“->”运算符右边时非法



#13



#include <vector>

vector<Vector> vv;//容器对象

Vector a(ve[4]);//调用默认或重载构造函数

vv.push_back(a);//添加容器元素



#14


虽然得不到我要的答案(可能是我表达不清楚吧),但是还是非常感谢大家了。就此结贴了。