不是类或结构名称_D3DCOLORVALUE

时间:2015-10-28 09:32:13

标签: c++ struct directx

编码图像查看器和转换器。 _D3DCOLORVALUE在d3d8types.h文件中定义。我使用的是DirectX 8 SDK。如果我用_D3DCOLORVALUE定义一个结构,会发生一些错误:

1. error C2504: '_D3DCOLORVALUE' : base class undefined
2. error C2061: syntax error : identifier '_D3DCOLORVALUE'
3. _D3DCOLORVALUE not a class or struct name

可能有什么问题?

注意:这个项目完全适用于VB6,但我尝试在VS2012上构建它

My3DStruct.h

#include "d3d8types.h"

struct __ColorValue : public _D3DCOLORVALUE //problem is here
{
public:
    void operator = (const D3DCOLORVALUE& cv) { r = cv.r; g = cv.g; b = cv.b; a = cv.a; }
    void operator = (D3DCOLOR cr) { r = ((cr & 0x00ff0000)>>16)/255.0f; g = ((cr & 0x0000ff00)>>8)/255.0f; b = (cr & 0x000000ff)/255.0f; a = ((cr & 0xff000000) >> 24)/255.0f; }
    void Set(float r2, float g2, float b2, float a2) { r = r2; g = g2; b = b2; a = a2; }

    D3DCOLOR ToD3DCOLOR() { return  (((DWORD)(a*255.0f))<<24) | (((DWORD)(r*255.0f))<<16) | (((DWORD)(g*255.0f))<<8) | (((DWORD)(b*255.0f))); }

    __ColorValue() {}
    __ColorValue(D3DCOLOR cr) { *this = cr; }
    __ColorValue(float r2, float g2, float b2, float a2) { this->Set(r2, g2, b2, a2); }

    void operator += (float fDelta) { r += fDelta; g += fDelta; b += fDelta; a += fDelta; }
    void operator -= (float fDelta) { r -= fDelta; g -= fDelta; b -= fDelta; a -= fDelta; }
    void operator *= (float fDelta) { r *= fDelta; g *= fDelta; b *= fDelta; a *= fDelta; }
    void operator /= (float fDelta) { if(0 == fDelta) return; r /= fDelta; g /= fDelta; b /= fDelta; a /= fDelta; }

    D3DCOLORVALUE operator + (float fDelta) { __ColorValue cv = *this; cv.r += fDelta; cv.g += fDelta; cv.b += fDelta; cv.a += fDelta; return cv; }
    D3DCOLORVALUE operator - (float fDelta) { __ColorValue cv = *this; cv.r -= fDelta; cv.g -= fDelta; cv.b -= fDelta; cv.a -= fDelta; return cv; }
    D3DCOLORVALUE operator * (float fDelta) { __ColorValue cv = *this; cv.r *= fDelta; cv.g *= fDelta; cv.b *= fDelta; cv.a *= fDelta; return cv; }
    D3DCOLORVALUE operator / (float fDelta) { __ColorValue cv = *this; cv.r /= fDelta; cv.g /= fDelta; cv.b /= fDelta; cv.a /= fDelta; return cv; }

    void operator += (const D3DCOLORVALUE& cv) { r += cv.r; g += cv.g; b += cv.b; a += cv.a; }
    void operator -= (const D3DCOLORVALUE& cv) { r -= cv.r; g -= cv.g; b -= cv.b; a -= cv.a; }
    void operator *= (const D3DCOLORVALUE& cv) { r *= cv.r; g *= cv.g; b *= cv.b; a *= cv.a; }
    void operator /= (const D3DCOLORVALUE& cv) { r /= cv.r; g /= cv.g; b /= cv.b; a /= cv.a; }

    D3DCOLORVALUE operator + (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 += cv; return cv2; }
    D3DCOLORVALUE operator - (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 -= cv; return cv2; }
    D3DCOLORVALUE operator * (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 *= cv; return cv2; }
    D3DCOLORVALUE operator / (const D3DCOLORVALUE& cv) { __ColorValue cv2(cv.r, cv.g, cv.b, cv.a); cv2 /= cv; return cv2; }
};

d3d8types.h

#ifndef D3DCOLORVALUE_DEFINED
typedef struct _D3DCOLORVALUE {
    float r;
    float g;
    float b;
    float a;
} D3DCOLORVALUE;
#define D3DCOLORVALUE_DEFINED
#endif

1 个答案:

答案 0 :(得分:1)

以两个下划线(__)开头的所有标识符均为reserved in C++;你不应该在任何地方使用它们作为你自己的代码。

您应该使用D3DCOLORVALUE代替_D3DCOLORVALUE。 DirectX 8 SDK现在已经很老了,但是由于你使用的是旧版本,你可以查看我的免费书籍The Direct3D Graphics Pipeline,它是DirectX 8/9的混合体。即使混合使用,当使用这个旧版本的DirectX时,该材料应该对您有用。 Chapter 1讨论了D3DCOLORD3DCOLORVALUE。您使用的是DirectX 8,因为您正在转换VB6代码而Direct3D 8是暴露给VB的最后一个API吗?在做端口时,你可能最好使用Direct3D 9。 Direct3D 10,11和12与9显着不同,但9大部分类似于8和8.1。

成语typedef struct _X X;是一个C-ism,因为C不能将结构的名称识别为完整类型。在C中你必须在整个地方写struct X,因此常见的习惯用法是将真实结构作为名称_X引入,并将X作为struct _X的同义词引入typedef。所有这些在C ++中都是无害的,但也完全没有必要。在C ++中,说struct X表示您可以在任何需要的地方使用X作为类型,而不必强迫您编写struct X或使用typedef

看起来您只是想通过在operator+结构上创建ColorValue成员来提供操作颜色值的语法糖。您无需从D3DCOLORVALUE派生以实现此目的;只需将运算符定义为具有适当类型的自由函数:

inline D3DCOLORVALUE &operator+(D3DCOLORVALUE &lhs, float delta)
{
    lhs.r += delta;
    lhs.g += delta;
    lhs.b += delta;
    lhs.a += delta;
    return lhs;
}

我相信微软自己在某些方面将结构中的这些免费函数或成员函数引入到SDK中。我不记得引入了哪个版本,但它可能是在DirectX 8之后。

最后,编写自己的value typesD3DCOLORVALUE类通常不是一个好主意。这些是没有虚拟析构函数的简单结构,并且从它们派生,使您容易受到object slicing errors的影响。我建议您prefer aggregation over inheritance

如果您唯一的动机是在operator+值上获得良好的D3DCOLORVALUE行为,那么我建议使用自由函数方法而不是推导。