Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Sublimee
7 / 7 / 1
Регистрация: 14.11.2012
Сообщений: 73
1

inline функции

09.08.2013, 17:13. Просмотров 822. Ответов 8
Метки нет (Все метки)

Объясните, пожалуйста, почему со всеми inline программа не работает, а если их закомментировать - работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// main.cpp
#include <iostream>
#include "employee.h"
using namespace std;
 
int main(void)
{
    employee Maxim;
    Maxim.SetItsAge(25);
    Maxim.SetItsSalary(60);
    Maxim.SetYearsOfService(5);
    cout << Maxim.GetItsAge() << " " << Maxim.GetItsSalary() << " " << Maxim.GetItsYearsOfService() << endl;
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// employee.h
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
 
class employee
{
    unsigned int itsAge;
    unsigned int itsYearsOfService;
    double itsSalary;
public:
    inline unsigned int GetItsAge() const;
    inline unsigned int GetItsYearsOfService() const;
    inline double GetItsSalary() const;
    inline void SetItsAge(unsigned int);
    inline void SetYearsOfService(unsigned int);
    inline void SetItsSalary(double);
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// emloyee.cpp
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
 
class employee
{
    unsigned int itsAge;
    unsigned int itsYearsOfService;
    double itsSalary;
public:
    inline unsigned int GetItsAge() const;
    inline unsigned int GetItsYearsOfService() const;
    inline double GetItsSalary() const;
    inline void SetItsAge(unsigned int);
    inline void SetYearsOfService(unsigned int);
    inline void SetItsSalary(double);
};
 
#endif
0
Вложения
Тип файла: rar employee.rar (577 байт, 3 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2013, 17:13
Ответы с готовыми решениями:

Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Здравствуйте. Знаю теорию, но не понимаю, на сколько должна быть маленькая...

inline функции vs инструкции inline функций
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если...

inline функции
Добрый вечер. Хотелось бы узнать, есть ли минусы у inline функций кроме...

inline функции
Как рабоает функция inline, и какие у неё преимущества? Если она такая крутая...

Inline функции.
Здравствуйте. Скажите пожалуйста, объявление функции как inline нужно делать...

8
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.08.2013, 17:22 2
реализация inline функций должна быть в хедер-файле
1
Sublimee
7 / 7 / 1
Регистрация: 14.11.2012
Сообщений: 73
09.08.2013, 17:45  [ТС] 3
Цитата Сообщение от Jupiter Посмотреть сообщение
реализация inline функций должна быть в хедер-файле
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// main.cpp
#include <iostream>
#include "Point.h"
#include "Rectangula.h"
using namespace std;
 
int main(void)
{
    Point point1, point2, point3, point4;
 
    point1.SetX(0);
    point1.SetY(0);
    point2.SetX(0);
    point2.SetY(10);
    point3.SetX(10);
    point3.SetY(10);
    point4.SetX(10);
    point4.SetY(0);
 
    Rectangula myRect(point1, point2, point3, point4);
    cout << myRect.GetArea();
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// point.h
#ifndef POINT_H
#define POINT_H
 
class Point
{
    int itsX;
    int itsY;
 
public:
    Point operator = (Point&);
    inline int GetX() const;
    inline int GetY() const;
    void SetX(int);
    void SetY(int);
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// point.cpp
#include "Point.h"
#include <iostream>
Point Point::operator = (Point& myPoint)
{
    itsX = myPoint.GetX();
    itsY = myPoint.GetY();
    return *this;
}
 
inline int Point::GetX() const
{
    return itsX;
}
 
inline int Point::GetY() const
{
    return itsY;
}
inline void Point::SetX(int newX)
{
    itsX = newX;
}
inline void Point::SetY(int newY)
{
    itsY = newY;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// rectangula.h
#ifndef RECTANGULA_H
#define RECTANGULA_H
 
#include "Point.h"
 
class Rectangula
{
    Point itsUpperLeft;
    Point itsUpperRight;
    Point itsLowerLeft;
    Point itsLowerRight;
 
public:
    Rectangula(Point UpperLeft, Point LowerLeft, Point LowerRight, Point UpperRight);
    ~Rectangula();
 
inline Point GetUpperLeft() const;
inline Point GetLowerLeft() const;
inline Point GetUpperRight() const;
inline Point GetLowerRight() const;
 
inline void SetUpperLeft(Point);
inline void SetUpperRight(Point);
inline void SetLowerLeft(Point);
inline void SetLowerRight(Point);
 
    int GetArea() const;
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// rectangula.cpp
#include "Rectangula.h"
 
Rectangula::Rectangula(Point UpperLeft, Point LowerLeft, Point LowerRight, Point UpperRight)
{
    itsUpperLeft = UpperLeft;
    itsUpperRight = UpperRight;
    itsLowerLeft = LowerLeft;
    itsLowerRight = LowerRight;
}
 
Rectangula::~Rectangula()
{
}
 
inline Point Rectangula::GetUpperLeft() const
{
    return itsUpperLeft;
}
inline Point Rectangula::GetLowerLeft() const
{
    return itsLowerLeft;
}
inline Point Rectangula::GetUpperRight() const
{
    return itsUpperRight;
}
inline Point Rectangula::GetLowerRight() const
{
    return itsLowerRight;
}
 
inline void Rectangula::SetUpperLeft(Point myPoint)
{
    itsUpperLeft = myPoint;
}
inline void Rectangula::SetUpperRight(Point myPoint)
{
    itsUpperRight = myPoint;
}
inline void Rectangula::SetLowerLeft(Point myPoint)
{
    itsLowerLeft = myPoint;
}
inline void Rectangula::SetLowerRight(Point myPoint)
{
    itsLowerRight = myPoint;
}
 
inline int Rectangula::GetArea() const
{
    return  ( itsUpperRight.GetY() - itsLowerRight.GetY() ) * 
            ( itsUpperLeft.GetX()  - itsUpperRight.GetX() );
}
Почему тогда в этом проекте с inline всё в порядке? Объясните, пожалуйста.
0
Вложения
Тип файла: rar rectangular.rar (948 байт, 2 просмотров)
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.08.2013, 17:57 4
Цитата Сообщение от Sublimee Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
class Point
{
* * int itsX;
* * int itsY;
public:
* * Point operator = (Point&);
* * inline int GetX() const;
* * inline int GetY() const;
* * void SetX(int);
* * void SetY(int);
};
потому что тут сеты без инлайна, с GetArea в Rectangula аналогично
1
Sublimee
7 / 7 / 1
Регистрация: 14.11.2012
Сообщений: 73
09.08.2013, 17:58  [ТС] 5
Цитата Сообщение от Sublimee Посмотреть сообщение
Почему тогда в этом проекте с inline всё в порядке? Объясните, пожалуйста.
Почему-то я был уверен, что второй проект нормально компилится, но он выдает ту же ошибку, что и первый. Видимо я перегрелся
То есть надо функции оформлять в хидере в таком виде?
C++
1
2
3
4
5
// employee.h
inline unsigned int GetItsAge() const
{
     return itsAge;
};
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.08.2013, 17:59 6
Цитата Сообщение от Sublimee Посмотреть сообщение
То есть надо функции оформлять в хидере в таком виде?
inline функции - да
1
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
09.08.2013, 18:39 7
Если я не ошибаюсь, модификатор inline нужен только в прототипе функции/метода.
0
Sublimee
7 / 7 / 1
Регистрация: 14.11.2012
Сообщений: 73
09.08.2013, 18:58  [ТС] 8
Цитата Сообщение от castaway Посмотреть сообщение
Если я не ошибаюсь, модификатор inline нужен только в прототипе функции/метода.
Ошибаетесь. Проверил.
Тема вроде незамысловатая, а вопрос вызвала.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
09.08.2013, 21:40 9
Цитата Сообщение от Sublimee Посмотреть сообщение
Ошибаетесь. Проверил.
И как же ты проверил?

Добавлено через 2 часа 30 минут
Все верно. Это такой нюанс типа шаблонов: http://www.parashift.com/c++-faq-lite/inline-nonmember-fns.html
Если ты хочешь объявить только прототип inline-функции в заголовочном файле, то получишь unresolved external.
Возможные выходы из ситуации:
1. описать тело функции в заголовочном файле
2. не использовать модификатор inline

Пример первого варианта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
 
class employee {
    unsigned int itsAge;
    unsigned int itsYearsOfService;
    double itsSalary;
 
public:
    unsigned int GetItsAge() const;
    unsigned int GetItsYearsOfService() const;
    double GetItsSalary() const;
 
    inline void SetItsAge( unsigned int temp ) {
        itsAge = temp;
    }
 
    void SetYearsOfService(unsigned int);
    void SetItsSalary(double);
};
 
#endif
1
09.08.2013, 21:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 21:40

Inline функции
Здарова всем! А может кто-нибудь объяснить товарищу внятно, для чего нужны...

inline - функции
Стоит-ли добавлять префикс inline ко всем функциям, состоящим из 1-2 строк?

Inline функции
Друзья!Инлайн функции могу быть определены только внтури класса?Или могут быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru