Форум программистов, компьютерный форум CyberForum.ru

inline функции - C++

Восстановить пароль Регистрация
 
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 67
09.08.2013, 17:13     inline функции #1
Объясните, пожалуйста, почему со всеми 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
Вложения
Тип файла: rar employee.rar (577 байт, 3 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2013, 17:13     inline функции
Посмотрите здесь:

inline функции C++
встроенные функции (inline) C++
Inline функции C++
C++ Inline функции.
C++ inline функции vs инструкции inline функций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.08.2013, 17:22     inline функции #2
реализация inline функций должна быть в хедер-файле
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 67
09.08.2013, 17:45  [ТС]     inline функции #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 всё в порядке? Объясните, пожалуйста.
Вложения
Тип файла: rar rectangular.rar (948 байт, 2 просмотров)
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.08.2013, 17:57     inline функции #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 аналогично
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 67
09.08.2013, 17:58  [ТС]     inline функции #5
Цитата Сообщение от Sublimee Посмотреть сообщение
Почему тогда в этом проекте с inline всё в порядке? Объясните, пожалуйста.
Почему-то я был уверен, что второй проект нормально компилится, но он выдает ту же ошибку, что и первый. Видимо я перегрелся
То есть надо функции оформлять в хидере в таком виде?
C++
1
2
3
4
5
// employee.h
inline unsigned int GetItsAge() const
{
     return itsAge;
};
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
09.08.2013, 17:59     inline функции #6
Цитата Сообщение от Sublimee Посмотреть сообщение
То есть надо функции оформлять в хидере в таком виде?
inline функции - да
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
09.08.2013, 18:39     inline функции #7
Если я не ошибаюсь, модификатор inline нужен только в прототипе функции/метода.
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 67
09.08.2013, 18:58  [ТС]     inline функции #8
Цитата Сообщение от castaway Посмотреть сообщение
Если я не ошибаюсь, модификатор inline нужен только в прототипе функции/метода.
Ошибаетесь. Проверил.
Тема вроде незамысловатая, а вопрос вызвала.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 21:40     inline функции
Еще ссылки по теме:

inline функции C++
C++ inline - функции
C++ Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
09.08.2013, 21:40     inline функции #9
Цитата Сообщение от Sublimee Посмотреть сообщение
Ошибаетесь. Проверил.
И как же ты проверил?

Добавлено через 2 часа 30 минут
Все верно. Это такой нюанс типа шаблонов: http://www.parashift.com/c++-faq-lit...ember-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
Yandex
Объявления
09.08.2013, 21:40     inline функции
Ответ Создать тему
Опции темы

Текущее время: 04:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru