2016-02-19 18 views
3

所以我有一个类(HostObject),它内部有一个复杂类(object1)的向量。如伪代码描述如下C++在没有默认初始化的情况下在类变量中分配向量大小

#DEFINE ARRAY_SIZE 10 
class HostObject { 
    //other member variables 
    vector<Object1> vec(ARRAY_SIZE); 

    //default constructor 
    HostObject(){ 
     //leave vector default constructed 
    } 

    //my custom constructor 
    HostObject(double parmeter1, double parameter2, doubleparameter3) { 

     //some code doing some calculations 

     for (int i = 0; i <ARRAY_SIZE; i++){ 

      vec.push_back(Object1(double p1, int p2, double p3, intp4)); 

     } 
    } 
} 

我知道这个代码被写入默认构造Object1s创建矢量任何时候HostObject将被初始化的方式。我的代码需要一个向量,所以我希望编译器知道向量的大小,以便它可以适当地分配我的向量所需的内存。我知道如果我想要更动态的分配,我可以使用储备。

我想我的问题是: 定义它时,它们是为矢量预留空间的一种方式,不需要默认初始化其中的对象或使用预留功能?

编辑:

我的目标是让内存空间分配的,所以当我构建HostObject的对象的数组键入获得分配的内存正确的金额。对象的内存大小是否根据默认构造函数的结果确定?

+0

没有'std :: vector'目前没有容量的构造函数。 – chris

+2

如果ARRAY_SIZE是一个常量,为什么不使用std :: array? – kfsone

回答

2

没有为std::vector为预留容量没有构造函数。您可以预留容量的唯一方法是使用reserve成员函数。

#DEFINE ARRAY_SIZE 10 
class HostObject { 
    //other member variables 
    vector<Object1> vec; 

    //default constructor 
    HostObject(){ 
     vec.reserve(ARRAY_SIZE); 
    } 

    //my custom constructor 
    HostObject(double parmeter1, double parameter2, doubleparameter3) { 
     vec.reserve(ARRAY_SIZE); 
     //some code doing some calculations 

     for (int i = 0; i <ARRAY_SIZE; i++){ 

      vec.push_back(Object1(double p1, int p2, double p3, intp4)); 

     } 
    } 
} 

Read morestd::vector

+1

您仍在使用“ARRAY_SIZE”数量的默认构造对象初始化数组。 '向量VEC (ARRAY_SIZE);'应该只是'向量VEC ;' –

+0

@RemyLebeau感谢。我修复了代码 – fnc12

1

您可以通过在默认的构造函数调用reserve()做到这一点。

#DEFINE ARRAY_SIZE 10 
class HostObject { 
    //other member variables 
    vector<Object1> vec; //vec(ARRAY_SIZE); // not here 

    //default constructor 
    HostObject() { 
    //leave vector default constructed 
    vec.reserve(ARRAY_SIZE);    // but here 
    } 

    //my custom constructor     // no need to change, since push_back will increase size automatically 
    HostObject(double parmeter1, double parameter2, doubleparameter3) { 

    //some code doing some calculations 

    for (int i = 0; i <ARRAY_SIZE; i++) { 

     vec.push_back(Object1(double p1, int p2, double p3, intp4)); 

    } 
    } 
} 

还要考虑使用static unsigned array_size = 10;作为HostObject类的成员,这样就可以创造HostObject对象每次动态改变大小。

HostObject ho1; // array size is 10 
HostObject::array_size = 20; 
HostObject ho2; // array size is 20 
+0

第二个构造函数仍然可以保留()内存,以便加快push_back()的速度。 –

相关问题