c++
не является java
или c#
.Эта конструкция вообще не будет генерировать никакого кода:
class X
{
public:
void foo()
{
std::cout << "Hello, world"<< std::endl;
}
};
Да, в Java после компиляции вы получите X.class, который вы можете использовать.Однако в c ++ это ничего не дает.
proof:
#include <stdio.h>
class X
{
void foo()
{
printf("X");
}
};
$ gcc -S main.cpp
$ cat main.s
.file "main.cpp"
.ident "GCC: (GNU) 4.9.3"
.section .note.GNU-stack,"",@progbits
В c ++ для компиляции чего-либо требуется что-то, кроме «определений».
Если выЧтобы эмулировать поведение Java-подобного компилятора, сделайте следующее:
class X
{
public:
void foo();
};
void X::foo()
{
std::cout << "Hello, world"<< std::endl;
}
, это сгенерирует объектный файл, содержащий void X::foo()
.
proof:
$ gcc -c test.cpp
$ nm --demangle test.o
0000000000000000 T X::foo()
Другой вариант:конечно, используйте встроенный метод, как и вы, но в этом случае вам нужно #include весь "Log.cpp" в ваш "Main.cpp".
В c ++ компиляция выполняется "единицами перевода" вместоклассы.Одна единица (скажем, .cpp
) создает один объектный файл (.o
).Такой объектный файл содержит машинные инструкции и данные.
Компилятор не видит ничего, кроме компилируемого модуля перевода.
В отличие от Java, когда компилируется main.cpp
, компилятор видит только то, что# включены в main.cpp и сам main.cpp.Следовательно, компилятор не видит содержимое Log.cpp в настоящее время.
Это только во время компоновки, объектные файлы, сгенерированные из блоков перевода, объединяются вместе.Но сейчас уже слишком поздно что-либо компилировать.
Класс со встроенной функцией (как в первом примере) не определяет машинные инструкции или данные.
Для встроенных членов машинных инструкций классабудет сгенерировано только при их использовании.
Поскольку вы используете членов своего класса в main.cpp
, который находится за пределами единицы перевода Log.cpp
во время компиляции компилятора Log.cpp не генерирует для них никаких машинных инструкций.
Проблема Одно правило определения - другое.