Встроенные конструкторы? Объясните это поведение [C ++] - PullRequest
0 голосов
/ 26 июня 2010

Рассмотрим этот код

#include <iostream> 
#include <cstdio>
using namespace std;

class Dummy {
public:
    Dummy();
};

inline Dummy::Dummy() {
    printf("Wow! :Dummy rocks\n");
}

int main() {
    Dummy d;
}

Все хорошо здесь!

Теперь я делаю эту модификацию.Я перемещаю объявление Dummy в "dummy.h".

class Dummy {
public:
    Dummy();
};

и определяю конструктор Dummy () следующим образом в "dummy.cpp"

#include "dummy.h"
inline Dummy::Dummy() {
    printf("Wow! :Dummy rocks\n");
}

И наконец, ямой основной файл выглядит так:

#include <iostream> 
#include <cstdio>
#include "dummy.h"
using namespace std;

int main() {
    Dummy d;
}

Он компилируется нормально, но я получаю ошибку компоновщика, сообщающую о неопределенной ссылке на Dummy :: Dummy ().

Любые идеи.1018 * -

Ответы [ 3 ]

3 голосов
/ 26 июня 2010

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

Хотя этот код должен работать в любом случае, с main() вызов конструктораесли ключевое слово inline не было там.Вы уверены, что передаете объектные файлы из обоих модулей компиляции компоновщику?

2 голосов
/ 26 июня 2010

Вы должны подумать о том, как работает компиляция в C ++, и об идее отдельных модулей компиляции, используемых в C ++, и об инкапсуляции, полученной с использованием заголовков и файлов cpp.

Смотрите здесь: http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6

Inline сообщает компилятору, что вместо вызова функции «копировать - вставить» ее код в месте вызова функции. Когда вы помещаете встроенное определение в файл CPP, оно не будет видимо при связывании с другими скомпилированными модулями (оно находится в файле cpp, а не в файле h), поэтому компилятор понимает из сигнатуры, размещенной в классе, что параметр Con не содержит параметров поэтому он не будет реализован по умолчанию. Но компоновщик не может найти тело функции, потому что он реализован inline в файле cpp.

0 голосов
/ 26 июня 2010

Попробуйте удалить встроенный спецификатор из файла вашей реализации. Если мое понимание верно, вы можете вставить только заголовок

...