строит в классах? - PullRequest
       21

строит в классах?

2 голосов
/ 11 марта 2011

У меня есть класс. Я сделал два отдельных файла, заголовок и файл C ++. Я использую его для создания более или менее легкого «объекта» для игры opengl, над которой я работаю. Вот файлы: 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 ambient
        {
            float r, g, b, a;
        };
        struct diffuse
        {
            float r, g, b, a;
        };
        struct specular
        {
           float r, g, b, a;
        };
    protected:
    private:
};

#endif // LIGHT_H

и 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
}

Когда я пытаюсь скомпилировать, выдается сообщение об ошибке: ошибка: ожидаемый неквалифицированный идентификатор перед символом ‘.’ | Для каждой строки, где я присваиваю значение члену структур (ambient, diffuse, specular) Во-первых, я даже не могу интерпретировать эту ошибку. Понятия не имею, что это значит. Во-вторых, я не вижу, что я делаю неправильно. Пожалуйста, помогите!

1 Ответ

7 голосов
/ 11 марта 2011

Это должно читаться так:

#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

Основная проблема заключается в том, что вы заявляли о существовании структур и давали имя типа, но вы не объявляли какие-либо переменные этого типа. Поскольку из вашего использования было ясно, что тип этих структур не нуждается в имени (они могут быть анонимными структурами), я переместил имя после объявления, чтобы вы объявили переменную.

Как указал 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
...