gpt4 book ai didi

c++ - 使用此指针指向类中的位域

转载 作者:行者123 更新时间:2023-11-30 02:05:37 27 4
gpt4 key购买 nike

我正在从事的项目需要将许多不同的硬件寄存器作为类对象向我们的用户表示。我几乎完成了我的对象模型,但我遇到了一个障碍,我还不确定如何超越。这些寄存器使用结构公开。所有这些寄存器结构都将继承自一个基本结构,该结构将提供有用的东西,例如如何从内存中获取特定的寄存器值并将其存储到位域。

现在,好消息是所有这些寄存器都是很好对齐的 DWORD。所以,我的代码是这样的:

struct Base {
DWORD offset;
Driver* pToDrv;

// methods to set/get values to the registers using the driver pointer
void SetRegister(DWORD val);
};


struct Register1 : public Base {
DWORD bit0 : 1;
DWORD bit1 : 1;
// etc. until 32 bits
DWORD bit31 : 1;

// getters/setters for the individual bits

void SetFullRegister(DWORD val) {
*(reinterpret_cast<DWORD*>(this)) = val; // uh-oh! This doesn't point to bitfield
SetRegister(reinterpret_cast<DWORD*>(this)); // same thing here
}
};

我已经在一个较小的程序中使用更简单的方法验证了 this 指向 Base 实例,即使在派生对象的方法中使用也是如此。我如何确保 this 指向我尝试执行的操作的派生对象的开始?

我试过以下方法:

*(reinterpret_cast<DWORD*>(this + sizeof(Derv))) = val;

虽然表面上没有什么不好的事情发生,但最终的结果却是什么都没有发生。我知道这不是真的,因为值是在某个地方分配的,但是,畏缩,我不知道在哪里。这显然是行不通的,也不是安全的方法。

如果我没有充分描述我的问题,请告诉我。

谢谢,安迪

最佳答案

也许你应该使用 union ?

struct Register1 : public Base {
union {
struct Bits {
DWORD bit0 : 1;
DWORD bit1 : 1;
// etc. until 32 bits
DWORD bit31 : 1;
};
DWORD dwReg;
} Reg;

// getters/setters for the individual bits

void SetFullRegister(DWORD val) {
Reg.dwReg = val;
}
};

关于c++ - 使用此指针指向类中的位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9487311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com