Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2011, 20:11   #1
Spice
Пользователь
 
Регистрация: 14.07.2008
Сообщений: 37
По умолчанию Именованный конструктор + inline

Приветствую, Форумчане!

Следующий код, оформленный в одном файле работает на ура.
Код:
class Point2
{
public:
	static Point2 Decar(double dX, double dY);
	static Point2 Polar(double angle, double radius);
private:
	double dX;
	double dY;
	Point2(double dX, double dY);
};

inline Point2::Point2(double dX, double dY): dX(dX), dY(dY)
{
}
inline Point2 Point2::Decar(double dX, double dY)
{
	return Point2(dX, dY);
}
inline Point2 Point2::Polar(double angle, double radius)
{
	return Point2(radius * cos(angle), radius * sin(angle));
}

void main()
{
	Point2 point2 = Point2::Decar(1, 2);
	return;
}
Если же объявление класса вынести в отдельный заголовочный файл,
Код:
class Point2
{
public:
	static Point2 Decar(double dX, double dY);
	static Point2 Polar(double angle, double radius);

private:
	double dX;
	double dY;

	Point2(double dX, double dY);
};
а определение в отдельный cpp файл,
Код:
inline Point2::Point2(double dX, double dY): dX(dX), dY(dY)
{
}
Point2 Point2::Decar(double dX, double dY)
{
	return Point2(dX, dY);
}
Point2 Point2::Polar(double angle, double radius)
{
	return Point2(radius * cos(angle), radius * sin(angle));
}
и затем проинклудить заголовочный файл, то линкер начинает ругаться на следующий код:
Код:
void main()
{
	Point2 point2 = Point2::Decar(1, 2);
	return;
}
Error 1 error LNK2019: unresolved external symbol "public: static class Point2 __cdecl Point2::Decar(double,double)" (?Decar@Point2@@SA?AV1@NN@Z) referenced in function _main E:\Coding\C++\Win32\Named Constructor Idiom\MainUnit.obj

Отказ от спецификатора inline решает вопрос, но так и не дает понять причину такого поведения.
У кого-нибудь есть вразумительное объяснение?
Что выбрать: зависимость от свободы или свободу от зависимости?..
Spice вне форума Ответить с цитированием
Старый 19.08.2011, 20:14   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

inline функции должны быть определены там, где объявлены. компилятор же должен подставить их тело в место вызова. т.е только в заголовочных файлах
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 19.08.2011, 20:25   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

А кстати, если не ошибусь насчёт версии стандарта, С++ 03 требует, чтобы main была int и заканчивалась return 0.
_-Re@l-_ вне форума Ответить с цитированием
Старый 20.08.2011, 01:27   #4
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
и заканчивалась return 0.
Не правда.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 20.08.2011, 09:06   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Не правда.
Ну, в смысле, возращала какое-либо целочисленное значение.
_-Re@l-_ вне форума Ответить с цитированием
Старый 20.08.2011, 09:48   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в функции main return 0 в конце не обязателен, считается что если программа дошла до конца основного блока в main, то все в порядке, и возвращается 0.
return нужен там только если нужно вернуть не 0, или выйти раньше конца основного блока.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.08.2011, 09:53   #7
Spice
Пользователь
 
Регистрация: 14.07.2008
Сообщений: 37
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
inline функции должны быть определены там, где объявлены. компилятор же должен подставить их тело в место вызова. т.е только в заголовочных файлах
Спасибо, вы ответили на мой вопрос.
Что выбрать: зависимость от свободы или свободу от зависимости?..
Spice вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на С. Именованный канал. litviak Помощь студентам 0 02.04.2011 13:40
Именованный диапазон A_L_E_X Microsoft Office Excel 2 14.02.2011 13:56
С++ (конструктор, деструктор, копирующий конструктор) Jane-sad Помощь студентам 2 01.10.2010 10:01
Именованный диапазон A_L_E_X Microsoft Office Excel 1 16.09.2010 14:19
Динамический именованный диапазон WIC Microsoft Office Excel 0 02.02.2009 12:09