C++11 SCèCTOR如何在SystemC中工作
在SystemC中,可以使用C++11 SCèCTOR如何在SystemC中工作,c++11,systemc,opencpu,C++11,Systemc,Opencpu,在SystemC中,可以使用SC\u-CTOR宏定义模块构造函数: #define SC_MODULE(user_module_name) \ struct user_module_name : ::sc_core::sc_module #define SC_CTOR(user_module_name) \ typedef user_module_name SC_CURRENT_USER_MODULE;
SC\u-CTOR
宏定义模块构造函数:
#define SC_MODULE(user_module_name) \
struct user_module_name : ::sc_core::sc_module
#define SC_CTOR(user_module_name) \
typedef user_module_name SC_CURRENT_USER_MODULE; \
user_module_name( ::sc_core::sc_module_name )
在sc\u core
之前需要了解使用范围说明符运算符。
根据宏,用户可以生成构造函数,但它需要参数sc\u module\u name
用户模块struct用户模块
继承类sc\u模块
,在类sc\u模块
中有不同的重载构造函数,如
sc_module();
sc_module( const sc_module_name& nm ); /* for those used to old style */
/* DEPRECATED */ sc_module( const char* nm );
/* DEPRECATED */ sc_module( const std::string& nm );
根据SC_-CTOR
它在构造函数体中声明任何类型为SC_-moduke_-name的对象,如果展开,构造函数将采用用户模块(::SC_-core::SC_-module){/*构造函数体*/}
。
要理解,请模拟相同的代码,但无法创建结构B类型的对象
class mname {
private:
char *name;
public:
mname() {
cout << "mname constructor invoked\n";
cout << "\t name\t" << name;
}
};
class A {
friend class mname;
private:
mname * mn;
public:
A() {
cout << "A constructor called\n";
}
A(const mname& m) {
cout << "freind class constructor of A\n";
}
A(const std:: string& s) {
cout << "string type construfctor\n";
}
};
struct B: A {
B(mname ) {
cout << "struct b cosntructor called\n";
}
};
int main() {
B obj(mname);
return 0;
}
类mname{
私人:
字符*名称;
公众:
mname(){
cout创建模块的典型代码是:
SC_MODULE(my_module)
{
SC_CTOR(my_module)
{
}
};
对于宏,此代码将扩展为:
struct my_module : ::sc_core::sc_module
{
typedef my_module SC_CURRENT_USER_MODULE;
my_module( ::sc_core::sc_module_name )
{
}
};
如果要创建此模块的实例,您需要在构造函数中传递::sc_core::sc_module_name
的实例,而不是像在示例代码中那样传递类名。您还可以传递一些内容来隐式创建::sc_core::sc_module_name
的实例,作为常量字符*
(cf::sc_核心::sc_模块名称
构造函数)
或
在示例代码中,只需将main替换为:
int main() {
mname name; // instance of mname
B obj(name);
return 0;
}
还有一个查询,因为struct my_module只定义了一个构造函数,该构造函数接受sc_module_name实例,那么const char*如何隐式创建sc_module_name实例。根据我对此的理解,还会有一个类型为my_module(const char*)的构造函数可能在C++概念中不好,先感谢提供一些更详细的理解,当char *通过时,SCI模块是SCMMODE Engy Noint的朋友,SCHMeMyEngEnter已经定义的构造函数有char *参数,但是另一个问题是,如果SCMMODELYNEYNEAR创建具有两个参数SCHMODE EngNEX(const char *,int)的构造函数当尝试创建B对象,如B obj(“另一个名称”,4),则失败
::sc_core::sc_module_name module_name("another_name");
my_module b(module_name);
int main() {
mname name; // instance of mname
B obj(name);
return 0;
}