指向数据成员的数据成员的指针
Pointer-to-data-member-of-data-member
我有以下代码(针对这个问题进行了简化):
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"可能不是从一开始就获取地址的正确类型,但在我的项目中,我可以解决这类问题(那里有一个完整的框架)。我只是不知道该如何指向这个成员中的一个。
记住,指向成员的指针就像使用成员一样。
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;
}
这不是我建议做的事情
另一种选择(我建议更少)是找到从类开头开始的字节偏移量,然后将其添加到对象地址中。显然,这将涉及到大量的前后投法,所以这看起来比上面的更糟。
这肯定有可能吗?老实说,我不知道,从来没有打过多少指针对成员。
假设您使用的是非POD类型(我知道您不是,但语法必须支持它)。然后,指向成员的指针可能需要封装的不仅仅是基指针的偏移量。根据多重继承的实现方式,也可能存在间接继承。对于多个级别的成员间接寻址,这可能会变得任意复杂,对于必须具有固定大小的类型来说,这是一个很大的要求。
也许你需要一个成对的向量,其类型由以下定义:
typedef Rectangle (StyleInfo::*StyleInfoMember);
typedef int (Rectangle::*RectangleMember);
依次应用每个以到达您想要的位置。当然,这仍然不允许您构建从StyleInfo到StyleInfo成员的任意成员的映射向量,因为它们不会全部通过Rectangle。为此,你可能需要打开一罐函子。。。
size(如&StyleInfo::size::width
)不是类型的名称。
请尝试size->width或size.width,具体取决于"AddStyleInfoMembers"对大小的了解程度。
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 共享 C++ 的数据成员指针
- C++数据成员:值与指针
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 如何在C++中使用类对象访问指针数据成员
- 将指向数据成员的指针传递给 std::invoke 时有哪些用例和有用性?
- 通过指针算法访问结构数据成员
- 如何强制实施有关指针数据成员的常量正确性
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- constexpr 偏移量,带有指向成员数据的指针
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 将数据成员的指针传递给基类构造函数是否安全?
- 虚拟指针大小因类数据成员而异
- "new"不会将内存分配给作为类的数据成员的指针
- 关于Lambdas,转换以功能指针以及私人数据成员的可见性
- 向上转换指向数据成员及其多态行为的指针
- 指向数据成员转换的 Constexpr 指针
- 关于C++中指向数据成员的指针的一些混淆
- C 细分故障访问类数据成员,而无需明确使用指针