在c ++类中进行指针数学运算:它是"合法的"吗?

Dan*_*n O 1 c++ pointers class pointer-arithmetic

阿海,海,

我想知道是否可以做以下事情:

class SomeClass
{
   int bar;
};

SomeClass* foo = new SomeClass();
int offset = &(foo->bar) - foo;

SomeClass* another = new SomeClass();
*(another+offset) = 3; // try to set bar to 3
Run Code Online (Sandbox Code Playgroud)

只是好奇,Dan O.

Unc*_*ens 11

我想tecnically它可能会成功.

但是,有几个问题.酒吧是私人的.您正在混合不同类型的指针(指针算法依赖于指针类型:int*+ 1和char*+ 1具有不同的结果,因为int和char具有不同的大小).

您是否也考虑过指向成员的指针:

#include <cassert>

struct SomeClass
{
   int bar;
};

int main() {
    int SomeClass::*mem_ptr = &SomeClass::bar;
    SomeClass foo;
    foo.*mem_ptr = 3;
    assert(foo.bar == 3);
}
Run Code Online (Sandbox Code Playgroud)

  • +1指针成员似乎是原始提问者所寻求的. (2认同)

Ste*_*sop 5

POD课程的想法是可以的(其他人对你的示例代码中的错误也有同样的看法).对于非POD类,您不一定只能通过对象指针的偏移来标识成员.例如,考虑成员是否为基类的一部分,或者等效地是否要将偏移量应用于指向派生类的指针,但是涉及多重或虚拟继承.

但是,您是否了解指向成员的指针?

struct SomeClass
{
    int bar;
};

// fieldtoset is a pointer-to-member
int SomeClass::*fieldtoset = &SomeClass::bar;

SomeClass* another = new SomeClass();
// syntax works as if "*fieldtoset" is "bar" (the member variable referand)
another->*fieldtoset = 3 // set bar to 3
Run Code Online (Sandbox Code Playgroud)