c++ - 指向数据成员的数据成员的指针

标签 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,我必须警告您,我真的将它简化为手头的问题:

error C3083: 'size': the symbol to the left of a '::' must be a type

我想表达的意思是,我不知道在此处使用的正确语法是什么。可能是“StyleInfo”不是从一开始就获取地址的正确类型,但在我的项目中我可以解决这类问题(那里有一个完整的框架)。我根本不知道如何指向这个成员中的成员。

最佳答案

记住指向成员的指针就像成员一样使用。

 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;
}

我不推荐这样做!

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

关于c++ - 指向数据成员的数据成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/243242/

相关文章:

c++ - "overloaded member function not found"引用

c++ - 在 Linux 中 fork 一个子进程后没有数据

c++ - QML 无法分配给不存在的属性

c++ - 如何将可变数量的参数传递给构造函数?

c++ - 确定插入排序中执行的轮类次数?

c++ - GCC : sorry, 未实现:重整过载

c++ - 如何在C++中获取指向文件开头的指针

c++ - 使用 C++ 构建错误 - ‘find_if’ 不是 ‘std' 的成员

c++ - 如何只在 Debug模式下编译一段源代码?

c++ - 如何在一个 vs2008 项目中将库与 __stdcall 和 __cdecl 结合起来