我是c++初学者,试图用openGL构建我的第一个应用程序。
我正在尝试创建一个Room类,它将使用诸如宽度、长度和高度这样的参数来创建一个网格对象,然后我想从主函数中提取这个对象。
在这个时候,我不想用任何参数初始化room,我只是尝试从内部创建一个基本的网格,CPP,而不是main。
我很难在教室中创建一个mesh对象作为私有变量,然后定义一个方法通过从main调用它来绘制它。
我正在使用Benny的非常棒的教程,并在我的visual解决方案中拥有他的确切GitHub文件。
我把它张贴在这里,他们包括网格和网格。CPP,这可能是问题来自于此链接。
下面是当前的代码(我已经包含了我主要包含的所有内容,只是为了确保)
-Room.h
#pragma once
#include <iostream>
#include <SDL2/SDL.h>
#include "display.h"
#include "mesh.h"
#include "shader.h"
#include "texture.h"
#include "transform.h"
#include "camera.h"
class Room
{
public:
Room();
~Room();
void drawRoom();
private:
Mesh* mesh;
};--Room.cpp
#include "Room.h"
#include <iostream>
#include <SDL2/SDL.h>
#include "display.h"
#include "mesh.h"
#include "shader.h"
#include "texture.h"
#include "transform.h"
#include "camera.h"
Room::Room()
{
Vertex vertices[] =
{
Vertex(glm::vec3(-1, -1, -1), glm::vec2(1, 0), glm::vec3(0, 0, -1)),
Vertex(glm::vec3(-1, 1, -1), glm::vec2(0, 0), glm::vec3(0, 0, -1)),
Vertex(glm::vec3(1, 1, -1), glm::vec2(0, 1), glm::vec3(0, 0, -1)),
Vertex(glm::vec3(1, -1, -1), glm::vec2(1, 1), glm::vec3(0, 0, -1)),
Vertex(glm::vec3(-1, -1, 1), glm::vec2(1, 0), glm::vec3(0, 0, 1)),
Vertex(glm::vec3(-1, 1, 1), glm::vec2(0, 0), glm::vec3(0, 0, 1)),
Vertex(glm::vec3(1, 1, 1), glm::vec2(0, 1), glm::vec3(0, 0, 1)),
Vertex(glm::vec3(1, -1, 1), glm::vec2(1, 1), glm::vec3(0, 0, 1)),
Vertex(glm::vec3(-1, -1, -1), glm::vec2(0, 1), glm::vec3(0, -1, 0)),
Vertex(glm::vec3(-1, -1, 1), glm::vec2(1, 1), glm::vec3(0, -1, 0)),
Vertex(glm::vec3(1, -1, 1), glm::vec2(1, 0), glm::vec3(0, -1, 0)),
Vertex(glm::vec3(1, -1, -1), glm::vec2(0, 0), glm::vec3(0, -1, 0)),
Vertex(glm::vec3(-1, 1, -1), glm::vec2(0, 1), glm::vec3(0, 1, 0)),
Vertex(glm::vec3(-1, 1, 1), glm::vec2(1, 1), glm::vec3(0, 1, 0)),
Vertex(glm::vec3(1, 1, 1), glm::vec2(1, 0), glm::vec3(0, 1, 0)),
Vertex(glm::vec3(1, 1, -1), glm::vec2(0, 0), glm::vec3(0, 1, 0)),
Vertex(glm::vec3(-1, -1, -1), glm::vec2(1, 1), glm::vec3(-1, 0, 0)),
Vertex(glm::vec3(-1, -1, 1), glm::vec2(1, 0), glm::vec3(-1, 0, 0)),
Vertex(glm::vec3(-1, 1, 1), glm::vec2(0, 0), glm::vec3(-1, 0, 0)),
Vertex(glm::vec3(-1, 1, -1), glm::vec2(0, 1), glm::vec3(-1, 0, 0)),
Vertex(glm::vec3(1, -1, -1), glm::vec2(1, 1), glm::vec3(1, 0, 0)),
Vertex(glm::vec3(1, -1, 1), glm::vec2(1, 0), glm::vec3(1, 0, 0)),
Vertex(glm::vec3(1, 1, 1), glm::vec2(0, 0), glm::vec3(1, 0, 0)),
Vertex(glm::vec3(1, 1, -1), glm::vec2(0, 1), glm::vec3(1, 0, 0)),
};
unsigned int indices[] = { 0, 1, 2,
0, 2, 3,
6, 5, 4,
7, 6, 4,
10, 9, 8,
11, 10, 8,
12, 13, 14,
12, 14, 15,
16, 17, 18,
16, 18, 19,
22, 21, 20,
23, 22, 20
};
mesh = new Mesh(vertices, sizeof(vertices) / sizeof(vertices[0]), indices, sizeof(indices) / sizeof(indices[0]));
}
Room::~Room()
{
}
void Room::drawRoom()
{
mesh.Draw();
}我得到了以下错误:
“2015\projects\archprogramer\archprogramer\room.cpp”左侧的错误C2228必须有类/struct/ ArchProgramer c:\users\nunoártolo\.Draw\visual studio ArchProgramer 78
非常感谢你的帮助!
发布于 2016-05-11 19:17:08
网格是指针(Mesh* mesh;)。要调用“绘制”,必须使用箭头符号:mesh->Draw();。
如果以后不想出现问题,您还应该在调用mesh != nullptr之前检查它(您可以简单地记录一下,您正在试图绘制一个未初始化的房间或类似的东西,比内存损坏或分段故障更容易调试)。
最后,在析构函数中,您应该有一行delete mesh;来释放网格实例可能使用的相关内存和其他资源(或者更好地使用unique_ptr声明网格,比如:std::unique_ptr<Mesh>,这样它的行为就像指针一样,但是当您破坏房间实例时,它将被自动删除。
发布于 2016-05-11 14:06:07
Mesh没有默认构造函数(不接受参数的构造函数),因为定义了以下构造函数:
Mesh(Vertex* vertices, unsigned int numVertices, unsigned int* indices, unsigned int numIndices);
您不是在房间的构造函数中构造Room::mesh,而是声明一个将在构造函数完成后销毁的局部变量。要正确构造Room::mesh,必须执行以下操作:
Room::Room() : mesh( /*insert arguments here*/ )
{ https://stackoverflow.com/questions/37164634
复制相似问题