А пачиму у миня прога не линкуетсяяааа?...

erotic

Прога такая вот:
component.h

#ifndef __COMPONENT__
#define __COMPONENT__
class Component
{
public :
int id;
};
#endif

component.cpp
 #include "Component.h"
inline int Component :: id
{
return (int) this;
}

sphere.h
 #ifndef __COMPONENT_SPHERE__
#define __COMPONENT_SPHERE__
#include "Component.h"
class Sphere : public Component
{
public :
void draw(int);
};
#endif

sphere.cpp
 #include "Sphere.h"
void Sphere :: draw(int mode)
{
int a;
a=id;
}

main.cpp
 #include "sphere.h"
int main
{
int a;
Sphere z;
a = z.id;
return 0;
}

файлы component.cpp, sphere.cpp и main.cpp включены в проект и каждый файл в отдельности компилируется, но прога не собирается с ошибкой
Linking...
main.obj : error LNK2019: unresolved external symbol "public: int __thiscall Component::id(void)" (?@QAEHXZ) referenced in function _main
Sphere.obj : error LNK2001: unresolved external symbol "public: int __thiscall Component::id(void)" (?@QAEHXZ)
C:\Documents and Settings\\My Documents\programming\C\cur\test\Debug\test.exe : fatal error LNK1120: 1 unresolved externals
test - 3 error(s 0 warning(s)
=

Если при этом в файле component.cpp функцию не объявлять как inline, то собирается прога. Также она собирается, если функцию Component::id описывать прямо в .h-файле при описании класса. Она тогда получается и inline, и все собирается.
Вот. Вопрос, собсно, почему такое поведение, и неужели мне придется все inline функции описывать прямо в описании класса?
Ах да! Все собирается вот как есть, если функцию id объявить как virtual int id;, но этого делать не хочется, да и не могу я понять, почему так все происходит.
Поможите...

okunek

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

erotic

Ясно, спасибо

vertyal17

А может зависеть от компилятора?

rosali

Какой вообще смысл писать inline в cpp файле?..

okunek

Такое - врядли

erotic

Ты не мог бы уточнить вопрос?

yolki

inline пишется в теле класса, т.е. в .h файле.

erotic

Т.е. надо объявлять функцию как inline в теле класса?
Не, проблему это не решит, можешь попробовать.

ppplva

В теле класса inline не пишется, а подразумевается.
А пишется в .h вне тела класса.

rosali

Не, проблему это не решит, можешь попробовать.

лол, решит, можешь попробовать.

erotic

Неа.
Вот то, что написал - действительно решит. А если просто объявить в .h-файле функцию как inline, а потом описать ее в .cpp файле - толку не будет.
Если не веришь - можешь зайти, я тебе наглядно продемонстрирую.

rosali

Надо написать _тело_ функции внутри класса, а .cpp файл следует стереть. Не то чтобы так надо всегда делать, просто один из вариантов.
Чтобы функция inline-илась, нужно чтобы ее тело было доступно компилятору в момент компиляции ее вызова. Этого никак нельзя добиться, если писать тело функции и ее вызов в разные модули компиляции.

erotic

Ну это практически то же самое, что написал.
Короче, спасибо
Оставить комментарий
Имя или ник:
Комментарий: