ไม่มีตัวสร้างเริ่มต้นสำหรับคลาสเมื่อใช้คลาสเป็นอาร์กิวเมนต์ของฟังก์ชัน [ซ้ำกัน]

ฉันกำลังพยายามกำหนดคอนสตรัคเตอร์สำหรับคลาส ShaderProgram ของฉันซึ่งรับอาร์กิวเมนต์อินพุตสองตัว ทั้งสองประเภท Shader ซึ่งเป็นคลาสอื่นที่ฉันกำหนดไว้ อย่างไรก็ตาม ฉันได้รับข้อผิดพลาด "ไม่มีตัวสร้างเริ่มต้นสำหรับคลาส" ซึ่งสำหรับฉันดูเหมือนว่า C++ กำลังพยายามสร้างวัตถุเชเดอร์สองวัตถุ เมื่อฉันแค่บอก C++ จริงๆ ว่าอาร์กิวเมนต์อินพุตของฉันมีประเภทใด ฉันยังใหม่มากกับ 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
โอ้พระเจ้า ฉันเข้าใจแล้ว ในทางเทคนิคแล้ว ฉันเริ่มต้นมันใน ShaderProgram.h ขอบคุณ!   -  person Zorobay    schedule 03.06.2020