2013-04-08 2 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... 
    //... 
    }