Я пытаюсь определить конструктор для моего класса ShaderProgram
, который принимает два входных аргумента, оба типа Shader
, который является еще одним классом, который я определил. Однако я получаю сообщение об ошибке «Для класса не существует конструктора по умолчанию», что мне кажется, что С++ пытается создать два объекта шейдера, когда я просто говорю С++, какие типы имеют мои входные аргументы. Я очень новичок в C++, так что это может быть просто глупое недоразумение. Это моя реализация:
ShaderProgram.cpp
#include "ShaderProgram.h"
ShaderProgram::ShaderProgram(Shader vertex_shader, Shader fragment_shader) // Somehow error here
{
vertex_shader_ = vertex_shader;
fragment_shader_ = fragment_shader;
id_ = glCreateProgram();
glAttachShader(id_, vertex_shader_.GetId());
glAttachShader(id_, fragment_shader_.GetId());
glLinkProgram(id_);
int success;
char info_log[512];
glGetProgramiv(id_, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(id_, 512, NULL, info_log);
logger.Error("Failed to link program using vertex shader at '" + vertex_shader_.GetFilepath() +
"' and fragment shader at '" + fragment_shader_.GetFilepath() + "'");
logger.Error(info_log);
} else
{
logger.Debug("Successfully linked program");
}
}
ShaderProgram.h
#include <glad/glad.h>
#include "Shader.h"
#pragma once
class ShaderProgram
{
private:
unsigned int id_;
Shader vertex_shader_;
Shader fragment_shader_;
Logger logger = Logger("Shader Program Logger");
public:
ShaderProgram(Shader vertex_shader, Shader fragment_shader);
};
Shader.cpp
#include "Shader.h"
Shader::Shader(std::string filepath, int type)
{
filepath_ = filepath;
id_ = glCreateShader(GL_VERTEX_SHADER);
source_ = ReadShaderFile(filepath);
c_source_ = source_.c_str();
glShaderSource(id_, 1, &c_source_, NULL);
glCompileShader(id_);
int success;
char info_log[512];
glGetShaderiv(id_, GL_COMPILE_STATUS, &success);
if (!success) {
glGetShaderInfoLog(id_, 512, NULL, info_log);
logger.Error("Failed to compile shader '" + filepath_ + "'");
logger.Error(info_log);
}
else {
logger.Debug("Successfully compiled shader '" + filepath_ + "'");
}
}
unsigned int Shader::GetId()
{
return id_;
}
std::string Shader::GetFilepath()
{
return filepath_;
}
std::string Shader::ReadShaderFile(std::string filepath)
{
std::ifstream file(filepath.c_str());
std::stringstream string_buffer;
string_buffer << file.rdbuf();
file.close();
std::string content = string_buffer.str() + '\0';
return content;
}
Shader.h
#include <string>
#include <fstream>
#include <sstream>
#include <glad/glad.h>
#include <iostream>
#include "../Logger.h"
#pragma once
class Shader
{
private:
int type_;
unsigned int id_;
std::string source_;
const char* c_source_;
std::string filepath_;
Logger logger = Logger("Shader Logger");
public:
private:
std::string ReadShaderFile(std::string filepath);
public:
Shader(std::string filepath, int type);
unsigned int GetId();
std::string GetFilepath();
};
vertex_shader_
иfragment_shader_
в конструктореShaderProgram
... Где-то есть дубликат, на который можно сослаться. - person ChrisMM   schedule 03.06.2020ShaderProgram.h
. Спасибо! - person Zorobay   schedule 03.06.2020