C++ 类中的结构?

C++ 类中的结构?,c++,class,codeblocks,struct,C++,Class,Codeblocks,Struct,我有课。我已经制作了两个分离的文件,头文件和C++文件。我正在使用它为我正在开发的opengl游戏创建一个或多或少的灯光“对象”。以下是文件: 轻 和Light.cpp #include "../include/Light.h" Light::Light(float ix, float iy, float iz, float ir, float ig, float ib , float ia, int itype, int iindex) { index=iindex; typ

我有课。我已经制作了两个分离的文件,头文件和C++文件。我正在使用它为我正在开发的opengl游戏创建一个或多或少的灯光“对象”。以下是文件: 轻

和Light.cpp

#include "../include/Light.h"

Light::Light(float ix, float iy, float iz, float ir, float ig, float ib , float ia, int itype, int iindex)
{
    index=iindex;
    type=itype;
    x=ix;
    y=iy;
    z=iz;
    ambient.r = 0.2;
    ambient.g = 0.2;
    ambient.b = 0.2;
    ambient.a = 1.0;
    specular.r = 0.8;
    specular.g = 0.8;
    specular.b = 0.8;
    specular.a = 1.0;
    diffuse.r = ir;
    diffuse.g = ig;
    diffuse.b = ib;
    diffuse.a = ia;
}

Light::~Light()
{
    //dtor
}
当我尝试编译时,它抛出一个错误,说: 错误:在“.”标记之前应为非限定id| 对于我为结构成员指定值的每一行(环境光、漫反射、镜面反射) 首先,我甚至不能解释这个错误。不知道这是什么意思。第二,我看不出我做错了什么。请帮忙

这应该是这样的:

#ifndef LIGHT_H
#define LIGHT_H


class Light
{
    public:
        Light(float ix, float iy, float iz, float ir, float ig, float ib , float ia, int itype, int iindex);
        virtual ~Light();
        float x,y,z;
        int index;
        int type;
        struct
        {
            float r, g, b, a;
        } ambient;
        struct
        {
            float r, g, b, a;
        } diffuse;
        struct
        {
           float r, g, b, a;
        } specular;
    protected:
    private:
};

#endif // LIGHT_H
基本问题是,您声明了结构存在并给出了类型的名称,但没有声明该类型的任何变量。因为,从您的使用情况来看,很明显这些结构的类型不需要名称(它们可以是匿名结构),所以我将名称移动到声明之后,所以您只是声明了一个变量

正如格曼所指出的,这仍然不是最优的。下面是一个更好的方法:

#ifndef LIGHT_H
#define LIGHT_H


class Light
{
    public:
        Light(float ix, float iy, float iz, float ir, float ig, float ib , float ia, int itype, int iindex);
        virtual ~Light();
        float x,y,z;
        int index;
        int type;

        struct Color {
            float r, g, b, a;
        };

        Color ambient, diffuse, specular;
    protected:
    private:
};

#endif // LIGHT_H

@Keelx:最好是有一个
Color
类,并使成员
Color环境;颜色扩散;彩色镜面反射。你在所有类型上都在重复自己:。@GMan:我累了,心烦意乱。我应该注意到的。是的,我很惊讶你没有注意到每个人都会这样。
#ifndef LIGHT_H
#define LIGHT_H


class Light
{
    public:
        Light(float ix, float iy, float iz, float ir, float ig, float ib , float ia, int itype, int iindex);
        virtual ~Light();
        float x,y,z;
        int index;
        int type;

        struct Color {
            float r, g, b, a;
        };

        Color ambient, diffuse, specular;
    protected:
    private:
};

#endif // LIGHT_H