2013-08-13 4 views
4

Я не знал, что я этого не знал :). и 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.

Благодарим вас за ваши комментарии и ответы.

пс: На самом деле я нашел этот вопрос, когда я еще не инициализирован этот статический член и я удалить дополнительную строку:

BaseWifi temp; 

в моей main(), который добавил больше моей путаницы !! ! (это один может зависеть от того, что я положил в конструктор 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); 
} 
+2

@rahman Что означает «не работает для меня», точно? – jrok

+0

Для второго aprproach вы получаете ошибки компиляции? Помните, что в этом случае эти ошибки? Потому что нормально это было бы хорошо. –

+0

@JoachimPileborg no сбор погрешность. он генерирует seg-ошибки, поскольку объекты (элементы) внутри конструктора BaseWifi не инициализируются правильно. когда эти внутренние элементы используются, происходят сбои seg. – rahman

ответ

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

Таким образом, объект инициализирован первым время вызывается статическая функция-член.

+0

Это приятное «обходное решение», хотя во многих случаях на C++ такие обходные пути - единственное решение. Спасибо – rahman

+0

Тем не менее, я попробую предложения, высказанные ниже, по моему вопросу о конструкторах копий и вернусь к вам, ребята, завтра. – rahman

0

Разница заключается в том, что первый подход заключается в использовании конструктора копирования для инициализации объекта, в то время как второй использует конструктор по умолчанию.

Смежные вопросы