不是类或结构名称_D3DCOLORVALUE
Not a class or struct name _D3DCOLORVALUE
正在对图像查看器和转换器进行编码_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; }
};
d3d8类型.h
#ifndef D3DCOLORVALUE_DEFINED
typedef struct _D3DCOLORVALUE {
float r;
float g;
float b;
float a;
} D3DCOLORVALUE;
#define D3DCOLORVALUE_DEFINED
#endif
在C++中保留所有以两个下划线(__
)开头的标识符;您永远不应该在任何地方将它们用于自己的代码。
您应该使用D3DCOLORVALUE
而不是_D3DCOLORVALUE
。DirectX 8 SDK现在很旧了,但既然你使用的是旧版本,你可以看看我的免费书《Direct3D图形管道》,它是DirectX 8/9的混合。即使有混合,当你使用这个旧版本的DirectX时,这种材料也应该很有用。第一章讨论了D3DCOLOR
和D3DCOLORVALUE
。您使用DirectX 8是因为您正在转换VB6代码,而Direct3D 8是向VB公开的最后一个API吗?在进行端口操作时,您最好使用Direct3D 9。Direct3D 10、11和12与9有很大不同,但9与8和8.1基本相似。
成语typedef struct _X X;
是C主义,因为C不将结构的名称识别为完整的类型。在C中,你必须到处写struct X
,因此常见的习惯用法是引入真实结构作为名称_X
,并引入X
作为struct _X
和typedef
的同义词。所有这些在C++中都是无害的,但也完全没有必要。在C++中,说struct X
意味着你可以在任何需要的地方使用X
作为类型,而不必强迫你写struct X
或使用typedef
。
看起来您只是试图通过在ColorValue
结构上创建operator+
成员来为操纵颜色值提供语法糖。为了实现这一点,您不需要从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之后。
最后,编写自己的类来派生像D3DCOLORVALUE
这样的值类型通常不是一个好主意。这些简单的结构没有虚拟析构函数,从它们派生会使您容易受到对象切片错误的影响。相反,我建议您更喜欢聚合而不是继承。
如果你唯一的动机是在D3DCOLORVALUE
值上获得良好的operator+
行为,那么我建议使用自由函数方法而不是推导。
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- std::vector的包装器,使数组的结构看起来像结构的数组
- 没有为自己的结构调用列表推回方法
- 奇怪的结构&GCC&clang(void*返回类型)
- 在 c++ 中拥有一组结构的正确方法是什么?
- vscode g++链路故障:体系结构x86_64的未定义符号
- C++概念:如何使用'concept'检查模板化结构的属性?