Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вопрос касательной inline-функции в классе


Автор: Ground 10.10.2010, 12:50
Всем доброго времени суток!
Возник вопрос по поводу компиляции встроенной функции. Создал проект с помощью раздельной компиляции, получились следующие файлы:
stack.h
stack.cpp
main.cpp

В stack.h определение класса:
Код

class Stack
{
private:
    struct node
    {
        int info;
        node* link;
    };
    node* top;
    int num;
public:
    Stack();
    ~Stack();
    int push(int info);
    int pop();
    int peek();
    inline int size();
};


В stack.cpp функция описана как:
Код

inline int Stack::size()
{
    return num;
}


В результате при компиляции в файле main.cpp эта функция не видна.
Как можно решить эту проблему?

Автор: azesmcar 10.10.2010, 12:52
Код

class Stack
{
private:
    struct node
    {
        int info;
        node* link;
    };
    node* top;
    int num;
public:
    Stack();
    ~Stack();
    int push(int info);
    int pop();
    int peek();
    int size() { // <----- ВОТ ТАК
        return num;
    }
};


Автор: mes 10.10.2010, 12:55
или перенести из .cpp в .h /.hpp
или избавиться от inline

Автор: Ground 10.10.2010, 12:57
azesmcar, это единственный способ? Не хотелось бы захламлять объявление класса.

Автор: azesmcar 10.10.2010, 13:08
Цитата(Ground @  10.10.2010,  12:57 Найти цитируемый пост)
azesmcar, это единственный способ? Не хотелось бы захламлять объявление класса. 

сделать функцию inline - да, избавиться от warning-а - нет (mes предложил альтернативу). Определение inline функции должно быть видимо там, где используется.
Цитата

An inline function shall be defined in every translation unit in which it is used and shall have exactly the same definition in every case

иначе встроить ее будет невозможно. Или так, как я написали или перенести
Код

inline int Stack::size()
{
    return num;
}

в stack.h

Автор: Ground 10.10.2010, 13:11
azesmcar
mes
Спасибо за помощь! Вопрос решен.

Автор: Любитель 10.10.2010, 13:59
А зачем вообще писать инлайн? Неужели вы сомневаетесь, что компилятор сам это заинлайнит (при включенной оптимизации)?!

Автор: maxim1000 10.10.2010, 15:57
для избежания захламления файла, описывающего класс, можно ввести новый файл stack_inline_functions.h и написать определения inline-функций там, а сам файл включить в основной

тогда и читабельность сохранится, и код функций будет доступен для встраивания

Автор: Леопольд 11.10.2010, 16:02
Цитата(azesmcar @  10.10.2010,  13:08 Найти цитируемый пост)
иначе встроить ее будет невозможно. Или так, как я написали или перенести
На самом деле это UB. VS 2008 даже ворнинга не выдавала при нарушении, компилялось на ура, но работало по разному на разных платформах...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)