Для класса не существует конструктора по умолчанию при использовании класса в качестве аргумента функции

Я пытаюсь определить конструктор для моего класса 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();
};

person Zorobay    schedule 03.06.2020    source источник
comment
Вы должны использовать списки инициализации для инициализации ваших vertex_shader_ и fragment_shader_ в конструкторе ShaderProgram... Где-то есть дубликат, на который можно сослаться.   -  person ChrisMM    schedule 03.06.2020
comment
Ошибка компилятора объясняет это. Вы пытаетесь создать объекты по умолчанию, у которых нет конструктора по умолчанию.   -  person Taekahn    schedule 03.06.2020
comment
Я предполагаю, что это происходит, когда вы пытаетесь создать экземпляр ShaderProgram. Где-то в вашей основной функции есть ошибка, которую вы не опубликовали.   -  person Nina    schedule 03.06.2020
comment
Omg да, я понимаю, я технически инициализирую их в ShaderProgram.h. Спасибо!   -  person Zorobay    schedule 03.06.2020