Nowe posty

Autor Wątek: funkcje inline w C++ zdefiniowane poza ciałem klasy  (Przeczytany 3435 razy)

  • Gość
funkcje inline w C++ zdefiniowane poza ciałem klasy
« dnia: 2008-11-13, 22:59:00 »
Mam kod:
Kod: c++ [Zaznacz]

#include
#include
using namespace std;

class MyClass {
 int mProperty;
public:
 inline void setProperty(int property);
 inline int getProperty();
};

inline void MyClass::setProperty(int property)
{
 mProperty = property;
}

inline int MyClass::getProperty()
{
 return property;
}


int main()
{
 MyClass myInstance;
 myInstance.setProperty(3);
 cout << "value = " << myInstance.getProperty() << endl;
 return 0;
}


w pliku, nazwijmy go, main.cpp. Jak widać, obydwie funkcje składowe klasy są zadeklarowane jako inline.
Robię
$ g++ main.cpp -o program
i wszystko gra.

Jednak gdy rozdzielę to na osobne pliki:
main.cpp:
Kod: c++ [Zaznacz]

#include
#include "MyClass.h"
using namespace std;

int main()
{
 MyClass myInstance;
 myInstance.setProperty(3);
 cout << "value = " << myInstance.getProperty() << endl;

 return 0;
}

MyClass.h:
Kod: c++ [Zaznacz]

#ifndef _MY_CLASS_H
#define _MY_CLASS_H

class MyClass {
 int mProperty;
public:
 inline void setProperty(int property);
 inline int getProperty();
};

#endif

oraz MyClass.cpp:
Kod: c++ [Zaznacz]

#include "MyClass.h"

inline void MyClass::setProperty(int property)
{
 mProperty = property;
}

inline int MyClass::getProperty()
{
 return mProperty;
}


to na linkerze się wywala.
Kompilacja MyClass.cpp przechodzi bez problemu:
$ g++ -c MyClass.cpp -o MyClass.o
Kompilacja main.cpp daje ostrzeżenia:
$ g++ -c main.cpp -o main.o
MyClass.h:7: warning: inline function ‘void MyClass::setProperty(int)’ used but never defined
MyClass.h:8: warning: inline function ‘int MyClass::getProperty()’ used but never defined
co już jest bardzo dziwne.
Natomiast jak chcę zbudować binarkę, to dostaję błędy:
$ g++ -o program main.o MyClass.o
main.o: In function `main':
main.cpp:(.text+0x65): undefined reference to `MyClass::setProperty(int)'
main.cpp:(.text+0x6e): undefined reference to `MyClass::getProperty()'
collect2: ld returned 1 exit status
Czyli linker nie widzi funkcji...

Co jest nie tak?

localghost

  • Gość
funkcje inline w C++ zdefiniowane poza ciałem klasy
« Odpowiedź #1 dnia: 2008-11-14, 16:30:00 »
Problem bierze sie z tego, ze definicje funkcji oznaczonych jako inline musza byc znane juz na etapie kompilacji. Stad warningi dla main.cpp, kompilator probujac podstawic w miejsce wywolan funkcji set|getProperty ich ciala, nie znajduje ich.
Albo zdejmij oznaczenie inline dla tych funkcji albo daj ich definicje do MyClass.h, moga byc w/poza cialem klasy ale musza byc w pliku naglowkowym.

  • Gość
funkcje inline w C++ zdefiniowane poza ciałem klasy
« Odpowiedź #2 dnia: 2008-11-14, 19:05:26 »
Hmm...
Brzmi to dosyć logicznie. Szkoda tylko, że w książkach ani w Internecie o tym nie piszą.

Funkcje zdefiniowałem poza ciałem klasy ze względu na przejrzystość kodu (podany powyżej kod jest tylko przykładem, a nie kodem, w którym na prawdę natknąłem się na ten problem) - dwu lub trzywierszowe funkcje w ciele klasy trochę utrudniają czytanie kodu (no chyba że jest to Java, w której funkcje zawsze definiuje się w ciele klasy).

Dzięki