指向复合类数据成员的指针-第2部分

Pointer to composite class data member - Part 2

本文关键字:2部 指针 复合 数据成员      更新时间:2023-10-16

对于我之前的问题c++:指向复合类数据成员的指针:

很抱歉没有描述我的需求。在我看来,解释起来有点复杂。但是,按照要求,请在下面找到我的问题的简要描述。

我想创建一个从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"));
}

你为什么需要这些XmlReader::Param::的东西呢?

我认为你在你的数据成员周围建立了栅栏,只是为了快乐地跳过它们…

Keep It Simple…

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...
    //...
  }