2013-04-08 41 views
-2

部分除我的先前的問題C++: Pointer to composite class data member指針複合類數據成員 - 2

對不起,不具有描述了我的需求。在我看來,解釋有點複雜。但是,如問,請在下面簡單描述我的問題。

我想創建一個從XML自動填充的參數類。

爲此,我將該參數類的每個數據成員添加到指向與其XML標記名稱關聯的成員的指針向量中。

在讀取XML的過程中,所有標記名都從XML中讀取,並且所有參數的值都會更新。

我還沒有找到任何方法來聲明我的類的「stParam1.fVal1」成員的成員指針(請參閱下面的註釋行)。

我該如何聲明一個指向類結構的成員指針?

class XmlReader 
{ 
public : 
    struct ST_PARAM 
    { 
     float XmlReader::*ptrFloat; 
     string tagName; 
    }; 

    void addAttribut(float XmlReader::* pfMembre, string& tagName) { 
     ST_PARAM stParam; 
     stParam.ptrFloat = pfMembre; 
     stParam.tagName = tagName; 
     _tstParams.push_back(stParam); 
    } 
    void ReadParameters(string& fileName){/*...*/} // Read Xml File and update all parameters in _tstParams 

private: 
    vector<ST_PARAM> _tstParams; 
}; 

class Param : public XmlReader 
{ 
public: 
    Param() { 
     addAttribut((float XmlReader::*)&Param::fVal1, string("XML_TAG_NAME_1"));    // OK 
     addAttribut((float XmlReader::*)&Param::fVal2, string("XML_TAG_NAME_2"));    // OK 

     // addAttribut((float XmlReader::*)&Param::stParam1.fVal1, string("XML_TAG_NAME_3")); // DON'T WORK -> Syntax is invalid 
     //... 
     } 

    // Some more complex parameters types 
    typedef struct 
    { 
     float fVal1; 
     float fVal2; 
    }ST_PARAM_1; 
    //... 

    // Declaration of several parameters 
    ST_PARAM_1 stParam1; 
    F32 fVal1; 
    F32 fVal2; 
    //... 
}; 

void test() 
{ 
    Param myParam; 
    myParam.ReadParameters(string("Parameters.xml")); 
} 

回答

0

爲什麼你需要這一切XmlReader::Param::的東西呢?

我覺得你建立你的數據成員圍繞圍欄只是跳躍在他們的樂趣...

保持簡單...

class XmlReader 
{ 
public : 
    struct ST_PARAM 
    { 
    float *ptrFloat; 
    string tagName; 
    }; 

    void addAttribut(float* pfMembre, string tagName) { 
    ST_PARAM stParam; 
    stParam.ptrFloat = pfMembre; 
    stParam.tagName = tagName; 
    _tstParams.push_back(stParam); 
    } 
    void ReadParameters(string fileName){/*...*/} // Read Xml File and update all parameters in _tstParams 

private: 
    vector<ST_PARAM> _tstParams; 
}; 

class Param : public XmlReader 
{ 
public: 
    Param() { 
    addAttribut(&fVal1, "XML_TAG_NAME_1");    // OK 
    addAttribut(&fVal2, "XML_TAG_NAME_2");    // OK 

    addAttribut(&stParam1.fVal1, "XML_TAG_NAME_3"); // OK... 
    //... 
    }