在C ++中使用类无效?

时间:2010-09-26 22:59:00

标签: c++ class opengl callback

嗨我试图将一些值传递给一个类,但它不会让我说它无效使用类'图'即时尝试发送3个值x,y,z这就是所有但是它不会让我继承人我试图做...

这里是main.cpp和调用类图的函数

 for (j = 0; j < num_elems; j++) {
    /* grab and element from the file */
    vlist[j] = (Vertex *) malloc (sizeof (Vertex));
    ply_get_element (ply, (void *) vlist[j]);


    int vert=sprintf(szFile,"vertex: %g %g %g", vlist[j]->x, vlist[j]->y, vlist[j]->z);
    /* print out vertex x,y,z for debugging */
    TextOut(hDC,600,j*20,szFile,vert);
   DrawFig->Figure(vlist[j]->x, vlist[j]->y, vlist[j]->z);
  }

错误在这里

   DrawFig->Figure(vlist[j]->x, vlist[j]->y, vlist[j]->z);
  }

这是WM_CREATE:我初始化所有内容

case WM_CREATE:
        hDC = GetDC(hWnd);
     //ShowWindow(g_hwndDlg,SW_SHOW);
    hRC=wglCreateContext(hDC);
    wglMakeCurrent(hDC,hRC);
     g_hwndDlg = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,DialogProc);

    DrawFig= new Figure(1.0,1.0,1.0);
    initGL();
     break;

这是图.h

class Figure
{
    public:
        Figure(float x,float y,float z);
        void Draw();
        float paramx(){
        return x1;
        }
        float paramy(){
        return y1;
        }
        float paramz(){
        return z1;
        }
    protected:
    private:
    float x1,y1,z1;
    list <Figure> m_vertices;
};

这是图.pp

Figure::Figure(float x,float y,float z){
    this->x1=x;
this->y1=y;
this->z1=z;
m_vertices.push_back(Figure(x1, y1, z1));
}

void Figure::Draw()
{
    list<Figure>::iterator p = m_vertices.begin();
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    gluLookAt(0.0,0.0,4.0,0.0,0.0,0.0,0.0,1.0,0.0);

    glColor3f(0.7f,1.0f,0.3f);
    glBegin(GL_LINE_LOOP);
    while(p != m_vertices.end()){
        glNormal3f(p->paramx(),p->paramy(),p->paramz());
        glVertex3f(p->paramx(),p->paramy(),p->paramz());
        p++;
    }
    glEnd();
}

任何想法?这是opengl,c ++和im使用代码块10.05以防万一 哦,是的,我在main.h初始化它像这样的DrawFig *图;

4 个答案:

答案 0 :(得分:3)

@ dark_charlie的答案几乎是正确的。这是一个更好的版本,实际上可以工作,但仍然可能不是你想要的:

class Figure  {
  // ...
public:
  void set(float x, float y, float z);
  // ...
};

void Figure::set(float x, float y, float z)
{
  // Your original code from the constructor
  this->x1 = x;
  this->y1 = y;
  this->z1 = z;
}

Figure::Figure(float x, float y, float z)
{
  // In the constructor call the newly created set function
  set(x, y, z);
  m_vertices.push_back(Figure(x1, y1, z1));
}


// Replace the faulty line with this:
DrawFig->set(vlist[j]->x, vlist[j]->y, vlist[j]->z);

现在,这几乎肯定不是你想要的。但要弄清楚你想做什么也很难。你有一个设计问题。设计问题是Figure有两个责任。它既是空间中的一个点,也是描述图形的一组点。这种责任的混乱导致你的班级实际上无法特别好地填补他们中的任何一个。

你需要两个班级。你需要一个Point类和一个Figure类。图类应允许您设置图形的位置,以及让您为图形轮廓添加点。

这是list<Figure> m_vertices;这个错误的重要线索。一个类在概念上包含它自己的实例是非常罕见的。通常当你这样做时,你正在构建自己的数据结构,如树或列表,然后该类包含指向其自身实例的指针。

另外,@ dark_charlie的简单修复导致无限递归这一事实是另一个错误的线索。

我猜这是一个家庭作业,所以除了告诉你我认为你已经有一个Point课程,你给我打电话Vertex这是我给你的所有帮助。< / p>

答案 1 :(得分:2)

您不能以您尝试的方式直接调用构造函数。创建一个set()函数,它将执行相同的工作并使用它而不是构造函数:

class Figure  {
  // ...
public:
  void set(float x, float y, float z);
  // ...
};

void Figure::set(float x, float y, float z)
{
  // Your original code from the constructor
  this->x1 = x;
  this->y1 = y;
  this->z1 = z;
  // m_vertices.push_back(Figure(x1, y1, z1));
}

Figure::Figure(float x, float y, float z)
{
  // In the constructor call the newly created set function
  set(x, y, z);
}


// Replace the faulty line with this:
DrawFig->set(vlist[j]->x, vlist[j]->y, vlist[j]->z);

编辑:

正如评论中所指出的,代码还有另一个缺陷 - 你有一个包含在图本身中的数字列表。我想你的意思是声明m_vertices如下:

list <Vertex> m_vertices;

然而,如果你想要一个三角形(或任何其他更高阶的多边形),你需要传递所有三个顶点的坐标而不是一个顶点的三个坐标:

void Figure::set(const Vertex& v1, const Vertex& v2, const Vertex& v3)
{
  m_vertices.push_back(v1);
  m_vertices.push_back(v2);
  m_vertices.push_back(v3);

  // The position of the figure will be its centroid
  this->x1 = (v1.x + v2.x + v3.x) / 3;
  this->y1 = (v1.y + v2.y + v3.y) / 3;
  this->z1 = (v1.z + v2.z + v3.z) / 3;
}

Figure::Figure(const Vertex& v1, const Vertex& v2, const Vertex& v3)
{
  set(v1, v2, v3);
}

您还需要调整循环以一次读取3个顶点,而不是只读一个,但我会让你自己决定:)

答案 2 :(得分:2)

关于直接构造函数调用:

请改用:

// destruct and reconstruct
DrawFig -> ~Figure();
new (DrawFig) Figure(vlist[j]->x, vlist[j]->y, vlist[j]->z);

它的作用:

  1. 它调用析构函数。

    析构函数本身将调用所有成员变量的析构函数。 float不需要/有一个析构函数,但std::list有。 std::list析构函数将释放所有包含对象。

  2. 它调用构造函数。

    构造函数本身将调用所有成员变量的构造函数。同样,float没有那个,并且它们没有以特定方式初始化,即它们再次被忽略。然后调用std::list的构造函数,它将初始化list

  3. 但是,使用dark_charlie的解决方案可能会更干净。


    DCs解决方案不仅更干净,而且还有不同之处。通过再次调用构造函数,您还可以重置Figure::m_vertices,我认为这可能不是您想要的。

    但是,也许代替set(如在DC解决方案中),您应该将其命名为add左右。

    此外,我不确定您是否真的想要FigureFigure::m_vertices那样(每个Figure包含一个列表给其他Figure)。

答案 3 :(得分:1)

一些事情:

  • 你实例化了Figure类吗?
  • list <Figure> m_vertices;是否已实例化?

使用C的 malloc 函数与C ++运行时代码的使用是混乱的,最好坚持使用 new 来保持C ++运行时的一致性。