Tidak ada konstruktor default untuk kelas saat menggunakan kelas sebagai argumen fungsi [duplikat]

Saya mencoba mendefinisikan konstruktor untuk kelas saya ShaderProgram yang mengambil dua argumen input, keduanya bertipe Shader yang merupakan kelas lain yang telah saya tetapkan. Namun, saya mendapatkan kesalahan "Tidak ada konstruktor default untuk kelas", yang bagi saya sepertinya C++ sedang mencoba membuat dua objek shader, padahal saya sebenarnya hanya memberi tahu C++ tipe apa yang dimiliki argumen input saya. Saya sangat baru mengenal C++ jadi ini mungkin hanya kesalahpahaman yang bodoh. Ini implementasi saya:

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 sumber
comment
Anda harus menggunakan daftar inisialisasi untuk menginisialisasi vertex_shader_ dan fragment_shader_ Anda di konstruktor ShaderProgram… Ada duplikat untuk ditautkan ke suatu tempat.   -  person ChrisMM    schedule 03.06.2020
comment
Kesalahan kompiler menjelaskannya. Anda mencoba membuat objek default yang tidak memiliki konstruktor default.   -  person Taekahn    schedule 03.06.2020
comment
Saya berasumsi ini terjadi ketika Anda mencoba membuat instance ShaderProgram. Ada kesalahan pada fungsi utama Anda di suatu tempat yang tidak Anda posting.   -  person Nina    schedule 03.06.2020
comment
Ya ampun, saya mengerti, secara teknis saya menginisialisasinya di ShaderProgram.h. Terima kasih!   -  person Zorobay    schedule 03.06.2020