我不知道我不知道这个:)。而 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);
}
答案 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)
这里的区别在于第一种方法是使用复制构造函数初始化对象,而第二种方法是使用默认构造函数。