如何在SystemC模块构造函数中初始化不可复制移动的对象数组
解决SystemC中不可复制模块的std::array初始化问题
针对你遇到的问题——在SystemC模块中初始化一个包含不可复制、不可移动且无默认构造函数的子模块的std::array,这里有直接可行的解决方案:
由于Object类没有默认构造函数,且禁用了复制/移动操作,我们不能依赖std::array的默认初始化,必须直接在数组的内存空间中构造每个Object实例,最适合的方式是使用C++的聚合初始化,在Object2的构造函数初始化列表中完成。
核心实现思路
- 利用
std::array的聚合体特性,通过双层大括号{{ ... }}包裹每个Object的构造调用; - 为每个子模块生成唯一的SystemC名字(避免模块名冲突,通常用父模块名加后缀);
- 直接传入每个
Object所需的Configuration参数,无需临时对象(因为复制/移动已禁用)。
完整代码示例
#include <systemc.h> #include <array> #include <string> // 假设Configuration是已定义的配置类 struct Configuration { // 示例配置成员 int param; }; class Object : public sc_module { public: // 带参数的构造函数 Object(sc_module_name name, Configuration config) : sc_module(name), m_config(config) {} // 禁用复制、移动构造和赋值 Object(const Object&) = delete; Object(Object&&) = delete; Object& operator=(const Object&) = delete; Object& operator=(Object&&) = delete; private: Configuration m_config; }; class Object2 : public sc_module { public: std::array<Object, 2> obj_array; // Object2的构造函数,接收自身模块名和两个子模块的配置 Object2(sc_module_name name, Configuration obj0_config, Configuration obj1_config) : sc_module(name), // 聚合初始化array,直接构造每个Object实例 obj_array{{ Object(sc_string(name) + "_obj0", obj0_config), Object(sc_string(name) + "_obj1", obj1_config) }} {} }; // 测试代码 int sc_main(int argc, char* argv[]) { Configuration cfg1{42}; Configuration cfg2{84}; Object2 top("top_module", cfg1, cfg2); sc_start(); return 0; }
关键细节说明
- 模块命名:用
sc_string(name) + "_obj0"生成子模块名字,确保整个SystemC仿真中模块名唯一,避免命名冲突; - 聚合初始化:
std::array是聚合体,外层大括号对应array本身,内层大括号对应数组的元素列表,这种方式会直接在数组的每个元素内存位置调用Object的构造函数,完全避免复制/移动操作; - 兼容性:该方案依赖C++11及以上标准,现代SystemC版本(如2.3.3+)都支持。
如果你的Configuration参数是统一的,也可以简化为:
Object2(sc_module_name name, Configuration common_config) : sc_module(name), obj_array{{ Object(sc_string(name) + "_obj0", common_config), Object(sc_string(name) + "_obj1", common_config) }} {}
内容的提问来源于stack exchange,提问作者sheridp
相关产品推荐
相关产品推荐

