我使用c ++和opengl已经有一段时间了,但从未真正沉浸在类中。我正在尝试为我的体素游戏创建一个 Block 类,但编译器给了我错误
block.h:13:7: note: candidate expects 1 argument, 0 provided
第 13 行是创建类的行。这是块头文件:
#ifndef BLOCK_H
#define BLOCK_H
#include <GL/glew.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "Shader.h"
#include "Camera.h"
using namespace glm;
class Block{
public:
void render(Camera cam);
glm::vec3 position;
Block(glm::vec3 position);
private:
void createMesh();
GLuint VAO, VBO;
Shader shader;
};
#endif
完整的错误:
world.cpp: In constructor ‘World::World(GLFWwindow*)’:
world.cpp:3:32: error: no matching function for call to ‘Block::Block()’
World::World(GLFWwindow* window)
^
world.cpp:3:32: note: candidates are:
In file included from world.h:9:0,
from world.cpp:1:
block.h:17:2: note: Block::Block(glm::vec3)
Block(glm::vec3 position);
^
block.h:17:2: note: candidate expects 1 argument, 0 provided
block.h:13:7: note: Block::Block(const Block&)
class Block{
^
block.h:13:7: note: candidate expects 1 argument, 0 provided
我还收到许多其他类似的编译器错误,这是输出:
http://pastie.org/10691691
---编辑---好的,我缩短了错误。以下是更新的错误日志:http://pastie.org/10691707
我看到一个错误,说Shader没有默认的构造函数,即Shader::Shader()
。对于该错误,Block 类的构造函数将需要在成员初始值设定项列表中构造它。
例如
Block::Block(glm::vec3 position)
: m_Shader( "needed shader args" )
{
}
看起来你正试图在某个地方建造一个世界级的方块?。它也在抱怨 Block 缺少默认构造函数。如果需要默认构造函数,则必须在块类定义中定义一个构造函数。或者,您需要在 World 类的成员初始值设定项列表中初始化块类,就像上面的着色器示例一样。
正如编译器所建议的那样,您也可以在类成员初始值设定项中使用,但您需要为此启用 C++11 支持。
您对Block
的定义要求在构造过程中传递glm::vec3
参数(或Block
本身进行复制构造)。您的World
构造函数似乎没有提供这样的参数。
我还必须在每个类中放置一个空的覆盖构造函数。问题是我在创建变量以及实例化对象时调用构造函数。下面是一个快速示例:
Shader::Shader(){
//Do nothing here is it just a override so we declare the variable before creating it.
}
Shader::Shader(char* vpath, char* fpath){
//Do proper shader stuff here
}