2008-10-28 29 views
2

我有下面这段代码(简化了这个问题):指针到数据成员的数据成员

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:“尺寸”:该符号左侧的“::”必须是一个类型

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

+0

试用评论#1 – 2009-04-03 06:56:32

回答

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

这是绝对有可能吗?我真的不知道,从来没有玩过指针到成员。

假设你使用的是非POD类型(我知道你不是,但语法将不得不支持它)。然后,指向成员的指针可能不得不封装来自基指针的偏移量。也可能存在间接性,取决于如何实现多重继承。对于多层次的成员间接寻址,这可能会变得任意复杂,这对于要求具有固定大小的类型是很大的要求。

也许你需要对一个矢量,通过定义类型:

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

每个应用依次得到你想要的。当然,这仍然不能让你建立一个从StyleInfo到StyleInfo的任意成员的映射矢量,因为它们不会全部通过Rectangle。为此,您可能需要打开一系列仿函数...

+0

我即将承认并咬住子弹,并认为这确实不可能。当然,这是所有POD类型,编译器会将它们全部折叠为访问这些成员时使用的简单偏移量。但这并不意味着有一种方法可以正确地执行其他建议。 – 2008-10-28 14:16:14

0

大小(如&StyleInfo::size::width)不是类型的名称。

请尝试size-> width或size.width,具体取决于'AddStyleInfoMembers`如何知道大小。