Проблемы со связыванием .cpp файлов в Code :: Blocks - PullRequest
1 голос
/ 25 октября 2011

У меня есть файл заголовка с именем cnVector.h , реализация которого записана в cnVector.cpp .Эти два файла находятся в одном каталоге.

cNormalCBP/
   + src/
       + cNormal/
           + cnUtils/
               - cnVector.h
               - cnVector.cpp
       - main.cpp

Заголовок содержит простое определение класса.

class cnVector {
    public:
        cnVector(double, double, double);

        inline cnVector cross(const cnVector&) const;
};

Реализация в файле .cpp следующим образом:

#include "cnVector.h"
/* constructor */   cnVector::cnVector(double x, double y, double z)
        : x(x), y(y), z(z) {
}

cnVector cnVector::cross (const cnVector& vOther) const {
    return cnVector(
        y * vOther.z + z * vOther.y,
        z * vOther.x + x * vOther.z,
        x * vOther.y + y * vOther.x );
}

Теперь следующий код из main.cpp разрывается на строку 3 из-за неопределенной ссылки на cnVector :: cross(cnVector const &) const;
Обратите внимание, как распознается реализация-конструктор, но не метод cnVector::cross.

int main() {
    cnVector v1(1, 0, 0), v2(0, 1, 0);
    cnVector v3 = v1.cross(v2);
}

Я также получаю сообщение об ошибке предупреждение:встроенная функция 'cnVector cnVector :: cross (const cnVector &) const' используется, но никогда не определяется .
Копирование реализации в main.cpp работает.

МожетВы объясните мне, почему я могу создать экземпляр cnVector , но реализация других методов не распознается?

1 Ответ

2 голосов
/ 25 октября 2011

Переместите встроенные функции в файл заголовка.Встроенные функции нуждаются в полных определениях в заголовочных файлах из-за того, как они интегрируются с остальным кодом.Компилятор (возможно) попытается вставить код во все места, где вызывается функция, поэтому он должен быть виден в файле заголовка, подобно тому, как шаблоны должны полностью присутствовать в файле заголовка.

...