指针到数据成员的数据成员的

时间:2008-10-28 13:17:19

标签: c++

我有以下代码(针对此问题进行了简化):

struct StyleInfo
{
    int width;
    int height;
};

typedef int (StyleInfo::*StyleInfoMember);

void AddStyleInfoMembers(std::vector<StyleInfoMember>& members)
{
    members.push_back(&StyleInfo::width);
    members.push_back(&StyleInfo::height);
}

现在,我们不得不重新调整一下,我们做了类似的事情:

struct Rectangle
{
    int width;
    int height;
};

struct StyleInfo
{
    Rectangle size;
};

typedef int (StyleInfo::*StyleInfoMember);

void AddStyleInfoMembers(std::vector<StyleInfoMember>& members)
{
    members.push_back(&StyleInfo::size::width);
    members.push_back(&StyleInfo::size::height);
}

如果这一切看起来都是一件愚蠢的事情,或者如果你觉得有一个很好的机会在这里因为某些原因应用BOOST,我必须警告你,我真的把它简化为手头的问题:

  

错误C3083:'size':'::'左边的符号必须是类型

我想说的是,我不知道在这里使用正确的语法是什么。可能是“StyleInfo”不是从地址开始的正确类型,但在我的项目中我可以修复那种事情(那里有一个完整的框架)。我根本不知道如何指向这个成员内的成员。

3 个答案:

答案 0 :(得分:2)

请记住,指向成员的指针只是像成员一样使用。

 Obj x;

 int  y = (x.*)ptrMem;

但与普通成员一样,您无法使用成员访问机制访问子类的成员。因此,您需要做的就是访问它,就像访问对象的成员一样(在您的情况下通过size成员)。

#include <vector>
#include <iostream>


struct Rectangle
{
    int width;
    int height;
};

struct StyleInfo
{
    Rectangle size;
};

typedef Rectangle   (StyleInfo::*StyleInfoMember);
typedef int         (Rectangle::*RectangleMember);

typedef std::pair<StyleInfoMember,RectangleMember>  Access;

void AddStyleInfoMembers(std::vector<Access>& members)
{
    members.push_back(std::make_pair(&StyleInfo::size,&Rectangle::width));
    members.push_back(std::make_pair(&StyleInfo::size,&Rectangle::height));
}


int main()
{
    std::vector<Access>     data;
    AddStyleInfoMembers(data);

    StyleInfo       obj;
    obj.size.width  = 10;

    std::cout << obj.*(data[0].first).*(data[0].second) << std::endl;
}

这不是我建议做的事情!

另一种选择(我建议更少)是从类的开头找到字节偏移量,然后将其添加到对象地址。显然这将涉及大量的后退和前锋,所以这看起来比上面更糟糕。

答案 1 :(得分:1)

这绝对可能吗?老实说,我不知道,从来没有玩指针成员。

假设您使用的是非POD类型(我知道您不是,但语法必须支持它)。指向成员的指针可能必须封装不仅仅是基指针的偏移量。也可能存在间接性,具体取决于多重继承的实现方式。对于多级成员间接,这可能会变得任意复杂,这对于要求具有固定大小的类型来说是很多。

也许你需要一对由以下定义的类型的矢量:

typedef Rectangle (StyleInfo::*StyleInfoMember);
typedef int (Rectangle::*RectangleMember);

依次申请每个人以获得您想去的地方。当然,这仍然不允许您构建从StyleInfo到StyleInfo的任意成员成员的映射向量,因为它们不会全部通过Rectangle。为此你可能需要打开一堆仿函数......

答案 2 :(得分:0)

size(如&StyleInfo::size::width中所示)不是类型的名称。

尝试使用size-&gt; width或size.width,具体取决于你的'AddStyleInfoMembers'对大小的了解。