Ошибка: не существует конструктора по умолчанию для класса Me sh, пытающегося передать Me sh в качестве параметра в другой конструктор - PullRequest
0 голосов
/ 31 марта 2020

У меня есть класс "Object"

Object::Object(Transform transform, Mesh mesh, Shader shader)
{
    this->transform = transform;
    this->mesh = mesh;
    this->shader = shader;
}

с 3-мя переменными-членами Transform, Me sh и Shader (в случае необходимости я работаю с OpenGL-GLEW и GLFW)

Приведенный выше конструктор возвращает сообщение об ошибке «конструктор по умолчанию для класса Me не существует sh».

Я определил конструктор для меня sh, но моя путаница заключается в том, что я пытаюсь назначить переданный объект переменной Me sh в конструктор, когда я создаю экземпляр объекта.

По сути, я хочу что-то вроде

Transform transform() //has a default constructor requiring no parameters
Mesh mesh(parameters)
Shader shader()
Object myObject(transform, mesh, shader);

в качестве обобщенного c примера.

В случае, если важен конструктор Me sh:

Mesh::Mesh(Vertex* verts, unsigned int numVerts)
{

    /*Vertex vertices[] = { Vertex(glm::vec3(-.5,-.5,0)),
                            Vertex(glm::vec3(0,.5,0)),
                            Vertex(glm::vec3(.5,-.5,0)) };*/
    //vertices = new Vertex[numVerts]{ verts };

    m_drawCount = numVerts;

    glGenVertexArrays(1, &m_vertexArrayObject);
    glBindVertexArray(m_vertexArrayObject);

    glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers);
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[position_VB]);
    glBufferData(GL_ARRAY_BUFFER, numVerts * sizeof(verts[0]), verts, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindVertexArray(0);
}

tl; dr Я пришел из C# фона, так что, возможно, я запутался, но я ' Я не уверен, зачем мне нужен конструктор по умолчанию для объекта, когда я передаю объект в качестве параметра, когда тот же объект можно создать с помощью конструктора, который я определил в другом месте моего кода.

1 Ответ

1 голос
/ 01 апреля 2020

Это:

Object::Object(Transform transform, Mesh mesh, Shader shader)
{
    this->transform = transform;
    this->mesh = mesh;
    this->shader = shader;
}

Вместо этого следует написать так:

Object::Object(const Transform& t, const Mesh& m, const Shader& s)
    : transform(t), mesh(m), shader(s)
{
}

C ++ не похож на C#, и вы очень запутаетесь, если вы предположим, что это так.

В C ++ все подобъекты создаются до того, как вы введете тело конструктора . Таким образом, подобъекты вашего Object класса (transform, mesh и shader) создаются с использованием конструкторов по умолчанию, потому что вы ничего не указали. присваивания , которые вы закодировали в теле вашего конструктора, не влияют на это.

Чтобы указать другие параметры для конструкторов ваших подобъектов, используйте инициализатор члена список , как показывает мой код выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...