C++11 SCèCTOR如何在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;

在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;  \
    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;
}