如果我要制作一个结构,请说:
struct FOO{
int x, y, z, a, b, c;
}
int main(){
FOO foo = {1, 2, 3, 4, 5, 6};
return 0;
}
无论如何都会创建一个可以访问FOO整数成员的指针吗? 也许通过制作指向foo的指针然后以某种方式修改它以整数递增?
我知道如果我要用一个返回指向第一个int的指针的方法来创建一个类,那么我可以使用++或[i](在for循环中)循环使用成员。但我想知道我是否可以通过了解结构的地址来访问结构成员(假设我对如何导航所述结构有很好的理解)
非常感谢任何见解。 谢谢!
答案 0 :(得分:2)
您可以为结构重载operator []:
struct bar // ALL_UPPERCASE is for macros!
{
int a, b, c, d, e, f;
int operator[](size_t i) const
{
switch(i)
{
case 0: return a;
case 1: return b;
case 2: return c;
case 3: return d;
case 4: return e;
case 5: return f;
default: assert(false);
}
}
};
答案 1 :(得分:1)
只是一个想法,这可能不起作用,但你可以尝试做一个指向foo结构的指针,然后将指针移动每个元素的int大小。如下所示:
int * ptr= & foo;
ptr++;
如果我能够很好地记住我的硬件设计类,那么结构实际上与内存中的数组非常相似,它可以为每个索引提供可变大小的内存块。
答案 2 :(得分:1)
struct FOO{
int x, y, z, a, b, c;
} __attribute__ ((packed))
FOO foo;
int *i = &foo;
在这种情况下,属性((packed))消除了填充所产生的问题,因为它可以消除它。然后递增i,受助者它将在结构的下一个元素中。
答案 3 :(得分:0)
这很简单:
Foo foo = { 1, 2, 3, 4, 5, 6 };
int* pfoo = &foo.x;
int structMembers = sizeof(Foo) / sizeof(int);
for (int i = 0; i < structMembers; i++)
{
cout << pfoo[i] << endl;
}
除了默认访问修饰符(结构中的私有,类中的公共)之外,结构和类之间没有区别。因此无论你怎么做类,你都可以使用结构。
答案 4 :(得分:-2)
据我所知,您需要这个:https://en.cppreference.com/w/cpp/utility/functional/mem_fn
如果您需要自己的实现,请执行以下操作:
#include <iostream>
struct Foo
{
int a = 1;
char b = 'a';
};
template<typename Struct, typename var_type>
const var_type member_get( Struct& obj, var_type Struct::* mem_var ) { return
obj.*mem_var; }
int main()
{
Foo x;
std::cout << member_get( x, &Foo::a ) << std::endl;
std::cout << member_get( x, &Foo::b ) << std::endl;
return 0;
}