请教各位大侠:如何在vc6中写自己的类(已经让系统生成了.h和.cpp文件),但是写的有错。不知道咋么该。
谢谢了!

解决方案 »

  1.   

    直接写,在h文件中写类定义,在cpp文件中写函数实现
      

  2.   

    ctrl+w打开MFC classwizard  add class
      

  3.   

    我知道是在.h中写类定义,在.cpp中写类的实现,但是写错了。我把代码贴上,能看出我的问题吗?如果有人能告诉我真的很感谢!
    1    Particle.h文件:
    #define MAX_PARTICLES 1000    // 定义粒子数量
    GLfloat speedFator = 1.0f;      // 粒子运动速度的控制因子 
    GLfloat angle_Z;         // 粒子旋转
    static GLfloat colors[12][3]= // 粒子颜色数组
    {{0.5f, 0.5f, 1.0f},  {0.75f, 0.5f, 1.0f}, {1.0f, 0.5f, 1.0f}, {0.5f, 1.0f, 0.5f},
    {1.0f, 1.0f, 0.5f},  {0.75f, 1.0f, 0.5f}, {1.0f, 0.5f, 0.5f}, {1.0f, 0.75f, 0.5f},
    {1.0f, 0.5f, 0.75f}, {0.5f, 1.0f, 0.75f}, {0.5f, 1.0f, 1.0f}, {0.5f, 0.75f, 1.0f}
    };// 星空粒子系统
    typedef struct
    {
    float life; // 粒子生命
    float fade; // 粒子衰减速度
    float r,g,b; // 粒子的颜色
    float x,y,z; // 粒子位置
    float xSpeed,ySpeed,zSpeed; // 粒子的速度
    float xg,yg,zg; // 粒子的运动加速度
    } PARTICLES;
    PARTICLES particle[MAX_PARTICLES]; // 粒子系统数组
    // 初始化星空粒子系统
    void ParticleInit(void);
    //绘制星空粒子系统
    void DrawParticle(void);
    2    Particle.cpp文件
    #include <stdio.h> // 标准输入输出头文件
    #include <olectl.h> // OLE控制库头文件
    #include <math.h> // 数学函数头文件
    #include <gl\gl.h> // OpenGL32库的头文件
    #include "Texture.h"
    #include "Particle.h"// 初始化星空粒子系统
    void ParticleInit(void)
    {
    for (int loop=0; loop<MAX_PARTICLES; ++loop)
    {
    particle[loop].life = 1.0f;// 赋予每个粒子完整生命
    particle[loop].fade = float(rand()%100)/1000.0f+0.003f; 命衰减速度
    particle[loop].r = colors[rand()%12][0]; // 粒子颜色的红色分量
    particle[loop].g = colors[rand()%12][1]; // 粒子颜色的绿色分量
    particle[loop].b = colors[rand()%12][2]; // 粒子颜色的蓝色分量
    particle[loop].xSpeed = float((rand()%300)-150.0f);沿x轴的随机速度(-150,150)
    particle[loop].ySpeed = float((rand()%300)-150.0f);沿y轴的随机速度(-150,150)
    particle[loop].zSpeed = float(rand()%150); // 沿z轴的随机速速(0,150)
    particle[loop].xg = 0.0f; // 沿x轴的加速度
    particle[loop].yg = 0.0f; // 沿y轴的加速度
    particle[loop].zg = 8.0f; // 沿z轴的加速度
    }
    }void DrawParticle(void)
    {
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 选择混合方式
    float x,y,z;
    for (int loop=0; loop<MAX_PARTICLES; ++loop) // 循环绘制
    {
    x = particle[loop].x; // 定义粒子坐标
    y = particle[loop].y;
    z = particle[loop].z; // 用glColor4f绘制粒子的颜色和透明度(生命),用life减fade即可得到粒子的生命变化
    glColor4f(particle[loop].r, particle[loop].g, particle[loop].b, particle[loop].life); glBegin(GL_TRIANGLE_STRIP); // 绘制粒子
        glTexCoord2f(1.0f, 1.0f); glVertex3f(x + 0.5f, y + 0.5f, z);
    glTexCoord2d(0.0f, 1.0f); glVertex3f(x - 0.5f, y + 0.5f, z);
    glTexCoord2d(1.0f, 0.0f); glVertex3f(x + 0.5f, y - 0.5f, z);
    glTexCoord2d(0.0f, 0.0f); glVertex3f(x - 0.5f, y - 0.5f, z);
    glEnd(); // 粒子位置更新
    particle[loop].x += particle[loop].xSpeed/(speedFator*1000.0f); // x轴上的位置
    particle[loop].y += particle[loop].ySpeed/(speedFator*1000.0f); // y轴上的位置
    particle[loop].z += particle[loop].zSpeed/(speedFator*1000.0f); // z轴上的位置 // 粒子速度更新
    particle[loop].xSpeed += particle[loop].xg;
    particle[loop].ySpeed += particle[loop].yg;
    particle[loop].zSpeed += particle[loop].zg; particle[loop].life -= particle[loop].fade;// 粒子生命的衰减 if (particle[loop].life <= 0.0f)// 如果粒子衰减到0
    {
    particle[loop].life = 1.0f; // 赋予新生命
    particle[loop].fade = float(rand()%100)/1000.0f+0.003f; // 随机衰减速度
    particle[loop].x = 0.0f; // 新粒子在(0.0f,0,0f,0.0f)处
    particle[loop].y = 0.0f;
    particle[loop].z = 0.0f;
    particle[loop].xSpeed = float((rand()%60)-30.0f);// x轴速度与方向
    particle[loop].ySpeed = float((rand()%60)-30.0f);// y轴速度与方向
    particle[loop].zSpeed = float(rand()%30); // z轴速度与方向
    particle[loop].r = colors[rand()%12][0];// 选择随机颜色的(r,g,b)值
    particle[loop].g = colors[rand()%12][1];
    particle[loop].b = colors[rand()%12][2];
    }
    }
    }
      

  4.   

    e:\计算机图形学\星空8_1类封装\5dg's stars.cpp(74) : error C2146: syntax error : missing ';' before identifier 'P'
    e:\计算机图形学\星空8_1类封装\5dg's stars.cpp(74) : error C2501: 'Particle' : missing storage-class or type specifiers
    e:\计算机图形学\星空8_1类封装\5dg's stars.cpp(74) : fatal error C1004: unexpected end of file found
    Error executing cl.exe.
      

  5.   

    无语了。。void ParticleInit(void)中三处注释前没有//。
      

  6.   

    你的错误提示貌似跟这两个文件关系不大啊。建议h文件加个
    #ifndef xxx
    #define xxx...你原来的东西.
    #endif
      

  7.   

    错误出现在5dg's stars.cpp中,没有说出现在你给的cpp文件里
      

  8.   

    各位大侠,是我太不认真了,发的代码有错----本来是为了大家看的不至于太头疼所以把代码对齐了一下没想到多删了些东西,很感谢大家指出!
    1   Particle.h文件
    #ifndef Particle_H
    #define Particle_H
    #define MAX_PARTICLES 1000    // 定义粒子数量
    GLfloat speedFator = 1.0f;      // 粒子运动速度的控制因子 
    GLfloat angle_Z;             // 粒子旋转
    static GLfloat colors[12][3]= // 粒子颜色数组
    {{0.5f, 0.5f, 1.0f},  {0.75f, 0.5f, 1.0f}, {1.0f, 0.5f, 1.0f}, {0.5f, 1.0f, 0.5f},
    {1.0f, 1.0f, 0.5f},  {0.75f, 1.0f, 0.5f}, {1.0f, 0.5f, 0.5f}, {1.0f, 0.75f, 0.5f},
    {1.0f, 0.5f, 0.75f}, {0.5f, 1.0f, 0.75f}, {0.5f, 1.0f, 1.0f}, {0.5f, 0.75f, 1.0f}
    };
    // 星空粒子系统
    typedef struct
    {
    float life; // 粒子生命
    float fade; // 粒子衰减速度
    float r,g,b; // 粒子的颜色
    float x,y,z; // 粒子位置
    float xSpeed,ySpeed,zSpeed; // 粒子的速度
    float xg,yg,zg; // 粒子的运动加速度
    } PARTICLES;
    PARTICLES particle[MAX_PARTICLES]; // 粒子系统数组
    // 初始化星空粒子系统
    void ParticleInit(void);//绘制星空粒子系统
    void DrawParticle(void);
    #endif2   Particle.cpp文件
    #include <stdio.h> // 标准输入输出头文件
    #include <olectl.h> // OLE控制库头文件
    #include <math.h> // 数学函数头文件
    #include <gl\gl.h> // OpenGL32库的头文件
    #include "Texture.h"
    #include "Particle.h"
    // 初始化星空粒子系统
    void ParticleInit(void)
    {
    for (int loop=0; loop<MAX_PARTICLES; ++loop)
    {
    particle[loop].life = 1.0f; // 赋予每个粒子完整生命
    particle[loop].fade = float(rand()%100)/1000.0f+0.003f; // 粒子生命命衰减速度
    particle[loop].r = colors[rand()%12][0]; // 粒子颜色的红色分量
    particle[loop].g = colors[rand()%12][1]; // 粒子颜色的绿色分量
    particle[loop].b = colors[rand()%12][2]; // 粒子颜色的蓝色分量
    particle[loop].xSpeed = float((rand()%300)-150.0f);//沿x轴的随机速度(-150,150)
    particle[loop].ySpeed = float((rand()%300)-150.0f);//沿y轴的随机速度(-150,150)
    particle[loop].zSpeed = float(rand()%150); // 沿z轴的随机速度(0,150)
    particle[loop].xg = 0.0f; // 沿x轴的加速度
    particle[loop].yg = 0.0f; // 沿y轴的加速度
    particle[loop].zg = 8.0f; // 沿z轴的加速度
    }
    }void DrawParticle(void)
    {
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE); // 选择混合方式
    float x,y,z;
    for (int loop=0; loop<MAX_PARTICLES; ++loop) // 循环绘制
    {
    x = particle[loop].x; // 定义粒子坐标
    y = particle[loop].y;
    z = particle[loop].z; // 用glColor4f绘制粒子的颜色和透明度(生命),用life减fade即可得到粒子的生命变化
    glColor4f(particle[loop].r, particle[loop].g, particle[loop].b, particle[loop].life); glBegin(GL_TRIANGLE_STRIP); // 绘制粒子
        glTexCoord2f(1.0f, 1.0f); glVertex3f(x + 0.5f, y + 0.5f, z);
    glTexCoord2d(0.0f, 1.0f); glVertex3f(x - 0.5f, y + 0.5f, z);
    glTexCoord2d(1.0f, 0.0f); glVertex3f(x + 0.5f, y - 0.5f, z);
    glTexCoord2d(0.0f, 0.0f); glVertex3f(x - 0.5f, y - 0.5f, z);
    glEnd(); // 粒子位置更新
    particle[loop].x += particle[loop].xSpeed/(speedFator*1000.0f); // x轴上的位置
    particle[loop].y += particle[loop].ySpeed/(speedFator*1000.0f); // y轴上的位置
    particle[loop].z += particle[loop].zSpeed/(speedFator*1000.0f); // z轴上的位置 // 粒子速度更新
    particle[loop].xSpeed += particle[loop].xg;
    particle[loop].ySpeed += particle[loop].yg;
    particle[loop].zSpeed += particle[loop].zg; particle[loop].life -= particle[loop].fade;// 粒子生命的衰减 if (particle[loop].life <= 0.0f)// 如果粒子衰减到0
    {
    particle[loop].life = 1.0f; // 赋予新生命
    particle[loop].fade = float(rand()%100)/1000.0f+0.003f; // 随机衰减速度
    particle[loop].x = 0.0f; // 新粒子在(0.0f,0,0f,0.0f)处
    particle[loop].y = 0.0f;
    particle[loop].z = 0.0f;
    particle[loop].xSpeed = float((rand()%60)-30.0f);// x轴速度与方向
    particle[loop].ySpeed = float((rand()%60)-30.0f);// y轴速度与方向
    particle[loop].zSpeed = float(rand()%30); // z轴速度与方向
    particle[loop].r = colors[rand()%12][0];// 选择随机颜色的(r,g,b)值
    particle[loop].g = colors[rand()%12][1];
    particle[loop].b = colors[rand()%12][2];
    }
    }
    }
    好想上面的定义有错,可能的确不是类封装。
      

  9.   

    恩,刚才那个错误我传的有错。很对不住大家!是下面这个
    5DG'S Stars.obj : error LNK2001: unresolved external symbol "void __cdecl ParticleInit(void)" (?ParticleInit@@YAXXZ)
    5DG'S Stars.obj : error LNK2001: unresolved external symbol "int __cdecl BuildTexture(char *,unsigned int &)" (?BuildTexture@@YAHPADAAI@Z)
    5DG'S Stars.obj : error LNK2001: unresolved external symbol "void __cdecl DrawParticle(void)" (?DrawParticle@@YAXXZ)
    LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
    Debug/5DG'S Stars.exe : fatal error LNK1120: 4 unresolved externals
      

  10.   

    不是你给的这些程序的问题,你最好检查一下你的工程,有没有main函数
      

  11.   

    我看过类的定义
    class/struct *{
    public:
    ....private:
    ..... 
    }
    类型 *::函数名()
    {...}
    不过类的封装和定义一样吗?那咋么把一个类的封装分到两个文件里:.h和.cpp呢?
      

  12.   


    结构体是封装的一种简单应用,你这个没有类啊!类封装到,.h和.cpp便于复用、调试和改错。
    你的问题不是上述程序的语法问题,和你的工程中的其他文件有关系。
      

  13.   

    typedef struct
    {
    float life; // 粒子生命
    float fade; // 粒子衰减速度
    float r,g,b; // 粒子的颜色
    float x,y,z; // 粒子位置
    float xSpeed,ySpeed,zSpeed; // 粒子的速度
    float xg,yg,zg; // 粒子的运动加速度
    } PARTICLES;
    ========
    你这个全是成员变量,成员函数呢
      

  14.   

    这两个是成员函数
    // 初始化星空粒子系统
    void ParticleInit(void);//绘制星空粒子系统
    void DrawParticle(void);
    #endif
      

  15.   

    袁静,我不是很理解你的意思,水平太低,领悟不到结构体是封装的一种简单应用,你这个没有类啊!类封装到,.h和.cpp便于复用、调试和改错。
    你的问题不是上述程序的语法问题,和你的工程中的其他文件有关系。
      

  16.   

    .h里的东西只是定义或者声明,就是告诉编译器有这些东西存在,.cpp里才是具体实现。编译器的编译单位是cpp。
    我觉得你的问题是你没有把c++面向对象的思想搞清楚,也不理解类和封装,建议看教材。
    这里的错误我估计是成员函数与全局函数的问题。
    如果void ParticleInit(void);void DrawParticle(void);这两个函数是成员函数,那么应该写成:
    class XXX
    {
    public:
        void ParticleInit(void);
        void DrawParticle(void);
    };而且cpp里应该写成
    void XXX::ParticleInit(void)

    //...

    void XXX::DrawParticle(void)
    {
    //...
    }
    其中XXX::表示函数为XXX类的成员函数。
    调用时是:
    XXX xx;//定义类变量
    xx.DrawParticle();
    xx.ParticleInit();而现在产生链接错误,我怀疑是你这两个函数定义的作用域有问题,要不就是include的头文件有问题,导致没有编译,或者其它问题。建议你检查函数定义以及头文件包含。还有就是头文件里有没有写#pragam once或者写成:
    #ifndef __XXX_H
    #define __XXX_H
    //你自己的类
    class
    {
        //
    };#endif否则也会有一堆链接错误。
      

  17.   

    不对,类和结构其实差不多,不一定非要用class的,用struct也是可以的。
      

  18.   

    给你一个简单的类的实例吧,仅是例子啊,类的功能是一个复数类:
    #include <iostream.h>
    class complex
    {
    public:
     complex();
     complex(double r,double i);//这两个是构造函数
     friend void print(const complex &c);//类的成员函数声明
    private:
     double real,imag;
    };
    //上面这个是类的定义,也就是写在h文件中的
    void complex::print(const complex &c)//类的成员函数实现
    {
     if(c.imag<0)
      cout<<c.real<<c.imag<<'i';
     else
      cout<<c.real<<'+'<<c.imag<<'i';
    }
    //这些是类的实现,是写在CPP文件中的,我只写了一个函数,你自己比较一下吧。
      

  19.   

    看样子是用OpenGL的aux库编程的,好像是没有主函数。
      

  20.   

    LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
    这个错误是没有主函数的main()的错吧。你要先搭个OpenGL的框架,再调用那几个函数。不关类的事。// shortest.c
    // The shortest OpenGL program possible#include <windows.h>   // Standard Window header required
    for all programs
    #include <conio.h>     // Console I/O functions
    #include <gl\gl.h>     // OpenGL functions
    #include <gl\glaux.h>  // AUX Library functionsvoid main(void)
            {
            // These are the AUX functions to set up the window
            auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
            auxInitPosition(100,100,250,250);
            auxInitWindow("My first OpenGL Program");        // These are the OpenGL functions that do something in the window
            glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);        glFlush();        // Stop and wait for a keypress
            cprintf("Press any key to close the Window\n");
            getch();
            }