`

c++ - initialize object array on the heap

    博客分类:
  • c++
c++ 
阅读更多

Follow our previous discussion of how to initialize the object array in this post - c++ - object array intializer in c++ , We said that the if we use the new operator to allocate objects array on the heap, there is no way to do the initialization except for the default constructors, well, here is some tricks that you can do to make the objects array allocated on the heap to have the non-default constructor called. 

 

the trick is to use the placement new operator.  (you may refer to this post - c++ - a sample class to show common aspects of object initialization/uninit on the definition of Account class, you  may need to add yet another memer methods).

 

here is the code. 

 

 

/**
* file 
*   heap_array_initializer.cpp
* description: 
*   THis shows some way to initialize an array of classes in the heap 
*/

#include "stdafx.h"
#include "acct.h"
#include <iostream>
#include <cstddef>
#include <new>  // include this header to use the placement new operator.
#include <utility> // what willl use use this for? abort()???
#include <vector>

using std::cout;
using std::endl;
using std::cerr;
using std::vector;
using std::pair;

typedef pair<char *, double > value_pair;

/** init_heap_array() 
*
*  declared as a static member function
*  provides for allocation and initialization
*  of heap array of class objects
*  init_values: init value pair for array elements
*  elem_count: number of elements in array if 0, array is size of init_value vector
*/

Account * 
	Account::init_heap_array(vector<value_pair> &init_values, 
	vector<value_pair>::size_type elem_count = 0) 
{

	vector<value_pair>::size_type vec_size = init_values.size();

	if (vec_size == 0 && elem_count == 0) { 
		return 0;
	}

	// size of the array to allocate is either elem_count 
	// or, if elem_count is 0, the size of vector..
	size_t elems = elem_count ? elem_count : vec_size;

	//grab a chunk of raw memory to stoe array
	char * p = new char [sizeof(Account) * elems];

	// individuallky initialize each array elements
	int offset = sizeof(Account);
	for (int ix = 0; ix < elems; ++ix) {
		// offset to the ixth elements,
		// if an initial value pair is provided
		//   pass that pair to the constructor
		// otherwise, invoke the default constructor 
		if (ix < vec_size) { 
			new (p+offset * ix) Account(init_values[ix].first, init_values[ix].second);
		}
		else new (p+offset * ix) Account;
	}

	// ok: elements allocated and initialized
	//    retur pointer to first element
	return (Account *) p;

}
分享到:
评论

相关推荐

    mysql-connector-c++-8.0.21-win32.zip

    3. **初始化数据库**:打开命令提示符,使用`mysqld --initialize-insecure`命令来初始化MySQL服务器,这将创建一个没有密码的root用户。 4. **启动服务**:使用`mysqld --install`命令安装MySQL服务,然后用`...

    Initialize-the-array.zip_array.initialize

    // 使用C++11的std::array容器,更加安全和类型安全 ``` 此外,VC++还支持C++标准模板库(STL)中的`vector`,它可以动态调整大小,并且提供了一种更高级的初始化方法: ```cpp std::vector&lt;int&gt; vec = {1, 2, 3,...

    System-Initialize、Finalize.mht

    System-Initialize、Finalize.mht

    Laravel开发-laravel-initialize

    这将创建一个名为`laravel-initialize`的新目录,并在其中安装Laravel框架及其所有依赖。 **三、理解项目结构** 安装完成后,让我们快速浏览一下项目的基本目录结构: - `app/`:包含你的应用程序代码,如控制器...

    ruby-object-initialize-lab-online-web-sp-000

    Person#initialize使用名称Person#initialize在lib/person.rb中定义一个Person类, lib/person.rb提供一个#initialize方法,该方法接受一个#initialize的参数。该参数应存储在@name实例变量中。 2. Dog#initialize...

    mysql第一次安装成功后初始化密码操作步骤

    在这种情况下,运行`mysqld --initialize-insecure --user=mysql`,这会创建一个无密码的用户。 6. **登录并修改默认密码**: 打开新的命令提示符,输入`mysql -u root -p`,然后输入之前生成的随机密码。登录成功...

    NX二次开发UF-DRF-initialize-leader-data 函数介绍

    NX二次开发UF_DRF_initialize_leader_data 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    NX二次开发UF-DRAW-initialize-view-info 函数介绍

    NX二次开发UF_DRAW_initialize_view_info 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    NX二次开发UF-ASSEM-initialize-sequencing-keep-layout 函数介绍

    NX二次开发UF_ASSEM_initialize_sequencing_keep_layout 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE ...

    NX二次开发UF-EVALSF-initialize-2 函数介绍

    NX二次开发UF_EVALSF_initialize_2 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士...

    NX二次开发UF-EVAL-initialize-2 函数介绍

    NX二次开发UF_EVAL_initialize_2 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,...

    NX二次开发UF-ASSEM-initialize-sequencing 函数介绍

    NX二次开发UF_ASSEM_initialize_sequencing 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的...

    NX二次开发UF-DRF-initialize-custom-symbol-text-data 函数介绍

    NX二次开发UF_DRF_initialize_custom_symbol_text_data 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE ...

    NX二次开发UF-EVAL-initialize 函数介绍

    NX二次开发UF_EVAL_initialize 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,...

    NX二次开发UF-EVALSF-initialize 函数介绍

    NX二次开发UF_EVALSF_initialize 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,...

    ruby-object-initialize-lab-v-000

    1. Person#initialize使用名称Person#initialize 在lib/person.rb中定义一个Person类, lib/person.rb提供一个#initialize方法,该方法接受一个#initialize的参数。 该参数应存储在@name实例变量中。2. Dog#...

    ruby-object-initialize-lab-sf-web-091619

    1. Person#initialize使用名称Person#initialize 在lib/person.rb中定义一个Person类, lib/person.rb提供一个#initialize方法,该方法接受一个#initialize的参数。 该参数应存储在@name实例变量中。2. Dog#...

    ruby-object-initialize-lab-bootcamp-prep-000

    在lib/person.rb中定义一个Person类, lib/person.rb提供一个#initialize方法,该方法接受一个#initialize的参数。 该参数应存储在@name实例变量中。 2. Dog#initialize使用名称和品种默认为“ Mutt” Dog#...

    angular-initialize:通过等待加载承诺来引导(不是推特)一个有角度的应用程序

    script src =" bower_components/angular-initialize/dist/angular-initialize.js " /&gt; 注意:源码是用es6写的,可以直接用browserify + babel 导入配置 angular . module ( 'myApp' , [ 'ngInitialize' ] ) ; &...

    LK-GD500-initialize.zip_LABVIEW 基恩士_LK-_LK-GD500设置_labview基恩士_恩基

    基恩士LK-GD500激光感测初始化设置和参数的录入

Global site tag (gtag.js) - Google Analytics