简体   繁体   English

如何初始化静态成员对象?

[英]How to initialize a static member object?

I didn't know that I didn't know this :) . 我不知道我不知道这个:)。 and a similar question here didn't help much. 这里类似的问题没有多大帮助。

So here i am asking. 所以我在这里问。 Please Consider the following class: 请考虑以下课程:

//in Agent.h
class Agent : public ns3::Object{
private:
//...

    static BaseWifi m_wifi;

//...
};

is this : 这是 :

//Agent.cpp
BaseWifi temp;
BaseWifi Agent::m_wifi = temp;

very much different from this: 与此截然不同:

//Agent.cpp
BaseWifi Agent::m_wifi = BaseWifi();

The second approach doesn't work for me. 第二种方法对我不起作用。 why and how? 为什么以及如何?

I don't want to trouble you with more codes coz I faced this problem deep in my program. 我不想用更多代码来麻烦你因为我在我的程序中遇到了这个问题。 The program generate seg faults as things(members) inside BaseWifi 's constructor are not initialized correctly. 程序生成seg错误,因为BaseWifi的构造函数中的东西(成员)没有正确初始化。 when those uninitialized internal members are used, seg faults occur. 当使用那些未初始化的内部成员时,会发生seg错误。

Thank you in advance for your kind comments and answers. 提前感谢您的好意见和答案。

ps: In fact I found this issue when I hadn't yet initialized this static member and I was deleting an extra line : ps:事实上,当我还没有初始化这个静态成员并且我删除了一个额外的行时,我发现了这个问题:

BaseWifi temp;

in my main() , which added more to my confusion!!!(this one could be dependent on what I put in BaseWifi 's constructor, so dont mind it for now) 在我的main() ,这增加了我的困惑!!!(这个可能取决于我放在BaseWifi的构造函数中,所以现在不要介意)

Update-1: For those who would like to see the BaseWifi: Update-1:对于那些想要看BaseWifi的人:

class BaseWifi {
    ns3::WifiHelper m_wifiHelper; // a wifi helper apply to setup vehicles Wifi

    ns3::NqosWifiMacHelper m_wifiMacHelper; // a wifi mac helper apply to setup vehicles Wifi

    ns3::YansWifiPhyHelper m_wifiPhyHelper; // a wifi phy helper apply to setup vehicles Wifi

    std::string m_phyMode;

    double m_rss;  // -dBm

    bool m_init_done;

public:

    BaseWifi();

    virtual void init();

    ns3::NetDeviceContainer Install(ns3::NodeContainer &c);

    virtual ~BaseWifi();
};

BaseWifi::BaseWifi() {
    m_init_done = false;
    m_rss = -80;
    m_phyMode ="DsssRate1Mbps";
    // TODO Auto-generated constructor stub
    init();
}

void BaseWifi::init() {
    NS_LOG_UNCOND("inside BaseWifi::init()");
      m_wifiHelper.SetStandard (ns3::WIFI_PHY_STANDARD_80211b);

      m_wifiPhyHelper =  ns3::YansWifiPhyHelper::Default ();

      // This is one parameter that matters when using FixedRssLossModel
      // set it to zero; otherwise, gain will be added
      m_wifiPhyHelper.Set ("RxGain", ns3::DoubleValue (0) );

      // ns-3 supports RadioTap and Prism tracing extensions for 802.11b
      m_wifiPhyHelper.SetPcapDataLinkType (ns3::YansWifiPhyHelper::DLT_IEEE802_11_RADIO);

      ns3::YansWifiChannelHelper wifiChannel;

      wifiChannel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");

      // The below FixedRssLossModel will cause the rss to be fixed regardless
      // of the distance between the two stations, and the transmit power
      wifiChannel.AddPropagationLoss ("ns3::FixedRssLossModel","Rss",ns3::DoubleValue (m_rss));

      m_wifiPhyHelper.SetChannel (wifiChannel.Create ());

      // Add a non-QoS upper mac, and disable rate control
      m_wifiMacHelper = ns3::NqosWifiMacHelper::Default ();

      m_wifiHelper.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
                                    "DataMode",ns3::StringValue (m_phyMode),
                                    "ControlMode",ns3::StringValue (m_phyMode));
      // Set it to adhoc mode
      m_wifiMacHelper.SetType ("ns3::AdhocWifiMac");

      m_init_done = true;
}

//Install the class's embedded settings on the nodes in this node container.
ns3::NetDeviceContainer BaseWifi::Install(ns3::NodeContainer &nc) {
    return m_wifiHelper.Install(m_wifiPhyHelper, m_wifiMacHelper, nc);
}

I have run into these kind of issues before. 我以前遇到过这类问题。 Apparently the initialization of static member objects very much depends on where the implementation is done in your code and (probably) on how the whole thing is compiled. 显然,静态成员对象的初始化很大程度上取决于代码中的实现位置以及(可能)整个程序的编译方式。 The solution that I found (somewhere) to the problem was to wrap the whole thing into a static member function like this: 我在这个问题上找到的解决方案是将整个事件包装成一个静态成员函数,如下所示:

//in Agent.h
class Agent : public ns3::Object{
    private:
    //...

    static BaseWifi& m_wifi();
    //...
};

and: 和:

//in Agent.cpp
BaseWifi& Agent::m_wifi() {
    static BaseWifi TheObject=BaseWifi();
    return TheObject;
}

This way the object is initialized properly the first time the static member function is called. 这样,在第一次调用静态成员函数时,对象就会被正确初始化。

这里的区别是第一种方法是使用复制构造函数初始化对象,而第二种方法是使用默认构造函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM