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

时间:2013-08-13 11:38:43

标签: c++ static

我不知道我不知道这个:)。而 similar question here 没有多大帮助。

所以我在这里问。请考虑以下课程:

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

    static BaseWifi m_wifi;

//...
};

就是这样:

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

与此截然不同:

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

第二种方法对我不起作用。 为什么以及如何?

我不想用更多代码给你带来麻烦因为我在程序中遇到了这个问题。程序生成seg错误,因为BaseWifi的构造函数中的(成员)未正确初始化。当使用那些未初始化的内部成员时,会发生seg错误。

提前感谢您的意见和答案。

P.S .:  事实上,当我还没有初始化这个静态成员并且我正在删除一个额外的行时,我发现了这个问题:

BaseWifi temp;

在我的main()中,这增加了我的困惑!!!(这个可能取决于我放在BaseWifi的构造函数中,所以现在不要介意)

更新-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);
}

2 个答案:

答案 0 :(得分:5)

我以前遇到过这类问题。显然,静态成员对象的初始化很大程度上取决于代码中的实现位置以及(可能)整个程序的编译方式。我在(某处)找到问题的解决方案是将整个事物包装成一个静态成员函数,如下所示:

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

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

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

这样,第一次调用静态成员函数时,对象就会被正确初始化。

答案 1 :(得分:0)

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