Я получаю эти две ошибки, и я не могу найти решение, которое работает.
LNK1120: 1 неразрешенное внешнее
Ошибка 1 ошибка LNK2019: неразрешенный внешний символ «public: __thiscall Vector3D :: Vector3D (класс Vector3D const &) «(?? 0Vector3D @@ QAE @ ABV0 @@ Z) ссылка на функцию» public: класс Vector3D __thiscall Vertex :: GetPosition (void) «(? GetPosition @ Vertex @@ QAE? AVVector3D @@ XZ)
Я думаю, что это связано с моим оператором Matrix и конструктором в моем классе Vector 3d
Любая помощь будет высоко ценится, так как я новичок в C ++
#ifndef MATRIX4_H
#define MATRIX4_H
#include "Vector3D.h"
class Matrix4
{
public:
Matrix4();
Matrix4(const Matrix4& rhs);
~Matrix4();
Vector3D Matrix4::operator *(Vector3D vector)
{
Vector3D newVector;
newVector.SetVector_X((m[0][0] * vector.GetVector_X()) + (m[0][1] * vector.GetVector_Y()) + (m[0][2] * vector.GetVector_Z()) + m[0][3]);
newVector.SetVector_Y((m[0][0] * vector.GetVector_X()) + (m[1][1] * vector.GetVector_Y()) + (m[1][2] * vector.GetVector_Z()) + m[1][3]);
newVector.SetVector_Z((m[0][0] * vector.GetVector_X()) + (m[2][1] * vector.GetVector_Y()) + (m[2][2] * vector.GetVector_Z()) + m[2][3]);
return Vector3D(newVector.GetVector_X(),newVector.GetVector_Y(),newVector.GetVector_Z());
}
void SetMatrix(float matrix[4][4])
{
memcpy(m,matrix,sizeof(matrix));
}
private:
float m[4][4];
};
#endif
Файл Vector3D.h
#ifndef VECTOR3D_H
#define VECTOR3D_H
class Vector3D
{
public:
Vector3D();
Vector3D(const Vector3D& rhs);
~Vector3D();
Vector3D(float VectorX, float VectorY, float VectorZ)
{
x=VectorX;
y=VectorY;
z=VectorZ;
}
void SetVector3D(float vector_X, float vector_Y, float vector_Z)
{
x = vector_X;
y = vector_Y;
z = vector_Z;
}
void SetVector_X(float vector_X)
{
x=vector_X;
}
void SetVector_Y(float vector_Y)
{
y=vector_Y;
}
void SetVector_Z(float vector_Z)
{
z=vector_Z;
}
float GetVector_X()
{
return x;
}
float GetVector_Y()
{
return y;
}
float GetVector_Z()
{
return z;
}
Vector3D GetVector()
{
return Vector3D(x,y,z);
}
private:
float x;
float y;
float z;
};
#endif
Это говорит о том, что компоновщик не может найти реализацию Vector3D(const Vector3D& rhs);
, Этот конструктор объявлен в вашем векторном классе, но не определен.
У вас есть реализация конструктора где-то в .cpp
файл, а этот файл известен вашему компилятору?
Компиляция C / C ++ работает так: сначала у вас есть несколько так называемых «модулей компиляции» — обычно каждый .cpp
-file является одним из таких модулей компиляции. Ваша программа состоит из всех этих отдельных модулей, связанных друг с другом (процесс «связывания» происходит после компиляции). Каждая функция, которая вызывается где-то, должна быть определена ровно один раз в некотором модуле компиляции, если он не определен встроенным (как другие методы вашего класса). Если метод объявлен, но не определен, компилятор не будет жаловаться — только компоновщик. Представьте себе блоки компиляции, имеющие «розетки» и «соединители», которые соответствуют соответствующим «розеткам» других блоков. Процесс компиляции просто создает эти модули, принимая определенную форму «сокета» (как указано в объявлениях), тогда как компоновщик фактически пытается соединить каждый «сокет» с его «соединителем». Итак, вы видите, как процесс компиляции может быть успешным, но ссылки нет.
Ошибки компоновщика могут быть сложно решить, особенно если вы еще не так опытны. Там может быть много причин для них:
И многое другое ..
Редактировать: Кроме того, вы должны передать вектор по константной ссылке и создать newVector, вызвав его конструктор, вместо создания объекта по умолчанию и последующего присвоения. И окончательное строительство в return statement
тоже не нужен. Улучшенный код:
Vector3D Matrix4::operator *(const Vector3D& vector)
{
return Vector3D(
(m[0][0] * vector.GetVector_X()) + (m[0][1] * vector.GetVector_Y()) + (m[0][2] * vector.GetVector_Z()) + m[0][3],
(m[0][0] * vector.GetVector_X()) + (m[1][1] * vector.GetVector_Y()) + (m[1][2] * vector.GetVector_Z()) + m[1][3],
(m[0][0] * vector.GetVector_X()) + (m[2][1] * vector.GetVector_Y()) + (m[2][2] * vector.GetVector_Z()) + m[2][3]
);
}
Ваша реализация Vector3D
кажется, что отсутствует фактическая реализация для конструктора копирования, следовательно, неразрешенная внешняя ошибка. Если вы не собираетесь копировать объект Vector3D, вы не сможете передать его в Matrix::operator*
по значению, что бы вызвать копию.
Тем не менее, я не думаю, что есть какие-либо причины объявлять и реализовывать конструктор копирования для Vector3D
в любом случае, поскольку он содержит только POD-типы, и сгенерированный компилятором конструктор копирования будет работать нормально. То же самое относится и к деструктору, ресурсы для управления отсутствуют, поэтому пусть компилятор выполняет свою работу.
Вы реализовали Vector3D
конструктор по умолчанию, конструктор копирования и деструктор? Вы показали свои заголовки, но не файлы реализации. Линкер жалуется на отсутствие определения Vector3D::Vector3D(Vector3D const&)
,