C++;——候选者需要1个参数,类定义为0 我已经使用C++和OpenGL了一段时间,但从来没有真正进入课堂。我试图为我的体素游戏创建一个块类,但是编译器给了我错误

C++;——候选者需要1个参数,类定义为0 我已经使用C++和OpenGL了一段时间,但从来没有真正进入课堂。我试图为我的体素游戏创建一个块类,但是编译器给了我错误,c++,class,object,C++,Class,Object,block.h:13:7:注意:候选者需要1个参数,提供0个 第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" #inclu

block.h:13:7:注意:候选者需要1个参数,提供0个

第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
我还收到许多其他类似的编译器错误,以下是输出:

---编辑--- 好的,我把错误缩短了一点。
下面是更新的错误日志:

我看到一个错误,说着色器没有默认构造函数,即
Shader::Shader()
。对于该错误,块类的构造函数需要在成员初始值设定项列表中构造它

比如说

Block::Block(glm::vec3 position)
:  m_Shader( "needed shader args" )
{
}
看起来你还想在某个地方建造一座世界级的建筑?。它也在抱怨块缺少默认构造函数。如果需要默认构造函数,则必须在块类定义中定义一个。或者需要在世界类的成员初始值设定项列表中初始化块类,就像上面的着色器示例一样


正如编译器所建议的,您也可以使用类内成员初始值设定项,但您需要为此启用C++11支持。

您对
块的定义要求在其构造过程中传递
glm::vec3
的参数(或用于复制构造的
块本身)。您的
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
}

您还应该附加调用代码/标题(shader.h等)。从错误中可以看出,您的构造函数签名与您在代码中创建它的方式不匹配。也许你可以看到下面:-不幸的是,我不知道OpenGL,所以我不能提供超级具体的方向。但对于着色器,似乎有两个构造函数选项,一个是顶点路径和片段路径,另一个是复制构造函数。如果您知道什么是vertexPath和fragmentPath,或者您有权访问要使用的着色器,则需要修改块构造函数的定义,以传递这些定义,而不是我在上面键入的“所需着色器参数”。此外,您可能需要查看此部分,尤其是有关成员初始值设定项列表的部分。
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
}