Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос касательной inline-функции в классе 
V
    Опции темы
Ground
Дата 10.10.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

Репутация: нет
Всего: 1



Всем доброго времени суток!
Возник вопрос по поводу компиляции встроенной функции. Создал проект с помощью раздельной компиляции, получились следующие файлы:
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 эта функция не видна.
Как можно решить эту проблему?
PM MAIL ICQ   Вверх
azesmcar
Дата 10.10.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Код

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;
    }
};


PM   Вверх
mes
Дата 10.10.2010, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



или перенести из .cpp в .h /.hpp
или избавиться от inline


--------------------
PM MAIL WWW   Вверх
Ground
Дата 10.10.2010, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

Репутация: нет
Всего: 1



azesmcar, это единственный способ? Не хотелось бы захламлять объявление класса.
PM MAIL ICQ   Вверх
azesmcar
Дата 10.10.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(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

Это сообщение отредактировал(а) azesmcar - 10.10.2010, 13:12
PM   Вверх
Ground
Дата 10.10.2010, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 321
Регистрация: 27.2.2006
Где: Комсомольск

Репутация: нет
Всего: 1



azesmcar
mes
Спасибо за помощь! Вопрос решен.
PM MAIL ICQ   Вверх
Любитель
Дата 10.10.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



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


--------------------
PM MAIL ICQ Skype   Вверх
maxim1000
Дата 10.10.2010, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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

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


Это сообщение отредактировал(а) maxim1000 - 10.10.2010, 15:58


--------------------
qqq
PM WWW   Вверх
Леопольд
Дата 11.10.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



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



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0984 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.