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

标签 c++

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

现在,好消息是所有这些寄存器都是很好对齐的 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/

相关文章:

c++ - CMake boost 导入的目标

c++ - vector 调整大小/分配不添加默认值

c++ - 将指针传递给以参数作为参数的函数

c++ - 使用 std::string 和 char* 的最烦人的解析实例

c++ - 分配 std::shared_ptr

c++ - 有效输入迭代器的默认构造

c++ - 在 Visual Studio 中停止运行时程序终止

c++ - C、C++?如何编译

C++ - 循环效率 : Storing temporarly values of a class member Vs pointer to this member

c++ - 匹配序列的正则表达式