当前位置: 首页 > 知识库问答 >
问题:

无法实例化包含用户定义类型的类

公冶桐
2023-03-14

我对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();

共有3个答案

方季同
2023-03-14

这是你的描述

着色器是一个具有字符串构造函数的类,仅在此类中声明它会导致错误。如果删除着色器的构造函数,则不会出现错误

描述问题。如果未在构造函数渲染的mem初始值设定项列表中显式调用类着色器的构造函数,则编译器将尝试调用数据成员着色器着色器的默认构造函数 。但是,它没有被声明,编译器会发出一个错误。

在指定参数的构造函数渲染的mem初始值设定项列表中调用类着色器的构造函数,或定义类着色器的默认构造函数。

韩弘壮
2023-03-14

您的问题存在于Render构造函数中(未在您的问题中显示)。因为你的类Render有一个成员变量Shader,它只有一个构造函数(使用一个std::字符串参数),你必须在构造函数初始化列表中显式地调用该构造函数:

Render::Render()
: shader("MyRenderShader"); // construct the Shader
{
}

如果删除着色器的构造函数,则不会出现错误。

请注意,当您删除着色器构造函数时,编译器会为您生成一个默认构造函数,这意味着您不需要在渲染中显式调用构造函数(尽管您应该这样做)。

鲍永春
2023-03-14

shaderRender的类成员。当实例化Render对象时,需要沿途构造Shader对象。因为它没有提供默认的c'tor,所以不能构造它(这是错误消息告诉您的)。

为了解决这个问题,要么为Shader1)提供默认的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的构造函数,这个声明应该有效。 这是杀手班: 我知道这可能有一个简单的解决方案,但到目前为止,我还没有看到。