我对Java有很好的理解,但我正在努力学习c来制作游戏,因为我认为c是一种更好的语言。但是我对c有一些问题。
#ifndef RENDER_H
#define RENDER_H
#include "shader.h"
class Render
{
public:
Render();
protected:
private:
Shader shader;
};
#endif
Shader
是一个带有字符串构造函数的类,只是在这个类中声明它会导致错误。如果我删除Shader
的构造函数,我不会得到错误。
错误:render.cpp:3:16:错误:没有匹配的函数调用着色器::着色器()
class Shader
{
public:
Shader(const std::string& fileName);
void Bind();
void Update(const Transform& transform, const Camera& camera);
virtual ~Shader();
这是你的描述
着色器是一个具有字符串构造函数的类,仅在此类中声明它会导致错误。如果删除着色器的构造函数,则不会出现错误
描述问题。如果未在构造函数渲染的mem初始值设定项列表中显式调用类着色器的构造函数,则编译器将尝试调用数据成员着色器着色器的默认构造函数
。但是,它没有被声明,编译器会发出一个错误。
在指定参数的构造函数渲染的mem初始值设定项列表中调用类着色器的构造函数,或定义类着色器的默认构造函数。
您的问题存在于Render
构造函数中(未在您的问题中显示)。因为你的类Render
有一个成员变量Shader
,它只有一个构造函数(使用一个std::字符串
参数),你必须在构造函数初始化列表中显式地调用该构造函数:
Render::Render()
: shader("MyRenderShader"); // construct the Shader
{
}
如果删除着色器的构造函数,则不会出现错误。
请注意,当您删除着色器
构造函数时,编译器会为您生成一个默认构造函数,这意味着您不需要在渲染
中显式调用构造函数(尽管您应该这样做)。
shader
是Render
的类成员。当实例化Render
对象时,需要沿途构造Shader
对象。因为它没有提供默认的c'tor,所以不能构造它(这是错误消息告诉您的)。
为了解决这个问题,要么为Shader
1)提供默认的c'tor,要么为Render
的c'tor使用初始化列表:
Render::Render() : shader("foo") {}
或
Render::Render(const std::string& shaderFilename) : shader(shaderFilename) {}
问题内容: 当我尝试运行此代码时: 我收到此错误: 我不明白为什么我无法实例化课程…在我看来似乎是对的… 问题答案: 是一个接口,因此您无法直接实例化它。您可以实例化一个具体的子类,例如:
问题内容: 我试图创建一个字符串集,其中填充了哈希表中的键,以便for- each循环可以遍历该Set并将默认值放入哈希表中。我仍在学习Java,但是我尝试做的方式不是有效的语法。有人可以演示这样做的正确方法,并解释为什么我的方法行不通,而他们的方法行得通。 问题答案: 不是类,而是接口。 因此,基本上可以仅实例类实现(,或) 例如 :
问题内容: 我有这堂课 我正在尝试使用此方法在此类之外创建变量 这给了我这个错误 问题答案: 在实例化泛型时,应将其替换为相应的对象。 例如:
问题内容: 我有以下代码: 错误: 是我的EJB项目中的一个实体。为什么我收到此错误? 问题答案: 是一个接口。接口无法实例化。只能实例化具体类型。你可能想使用,这是一个 实现 了的接口。
我试图将图像添加到数组中,但它给出了错误不能实例化类型Image j 原因会是什么?
下面是我收到错误的代码(在“new”之后的第二个“Killer”处)。 这给我带来了不少麻烦,因为我看不出为什么基于Killer的构造函数,这个声明应该有效。 这是杀手班: 我知道这可能有一个简单的解决方案,但到目前为止,我还没有看到。