首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据指针-数据成员

数据指针-数据成员
EN

Stack Overflow用户
提问于 2008-10-28 13:17:19
回答 3查看 437关注 0票数 3

我有以下代码(简化为这个问题):

代码语言:javascript
复制
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);
}

现在,我们不得不对它进行一些重构,我们做了这样的事情:

代码语言:javascript
复制
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);
}

如果这一切看起来都是一件愚蠢的事情,或者如果你觉得有一个很好的机会在这里应用,出于某种原因,我必须警告你,我真的把它简化到了眼前的问题上:

error C3083:'size':符号位于'::‘必须是类型

我想指出的一点是,我不知道在这里使用什么语法是正确的。从一开始,"StyleInfo“可能不是获取地址的正确类型,但在我的项目中,我可以修复这类事情(有一个完整的框架)。我只是不知道该怎么指出这个会员。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-10-28 15:55:36

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

代码语言:javascript
复制
 Obj x;

 int  y = (x.*)ptrMem;

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

代码语言:javascript
复制
#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;
}

这不是我建议做的事!

另一种选择(我推荐的更少)是从类的开头找到字节偏移量,然后将其添加到对象地址中。显然,这将涉及大量的前后转换,因此这看起来比上面的更糟糕。

票数 2
EN

Stack Overflow用户

发布于 2008-10-28 13:52:20

这绝对有可能吗?老实说,我不知道,从来没有玩过很多点对点的游戏。

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

也许您需要一个由以下所定义的类型的对向量:

代码语言:javascript
复制
typedef Rectangle (StyleInfo::*StyleInfoMember);
typedef int (Rectangle::*RectangleMember);

依次应用每一种方法来达到你想要达到的目的。当然,这仍然不允许您构建一个从StyleInfo到任意StyleInfo成员的映射向量,因为它们不会都经过矩形。为此你可能需要打开一罐函子..。

票数 1
EN

Stack Overflow用户

发布于 2008-10-28 13:55:25

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

尝试size->width或size.width,这取决于'AddStyleInfoMembers`‘对大小的了解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/243242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档