Именованный конструктор + 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;
}
{
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);
};
{
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));
}
{
}
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;
}
{
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 решает вопрос, но так и не дает понять причину такого поведения.
У кого-нибудь есть вразумительное объяснение?
Цитата:
Every program shall contain exactly one definition of every non-inline function or object that is used in that
program; no diagnostic required. The definition can appear explicitly in the program, it can be found in the
standard or a user-defined library, or (when appropriate) it is implicitly defined (see 12.1, 12.4 and 12.8).
An inline function shall be defined in every translation unit in which it is used.
program; no diagnostic required. The definition can appear explicitly in the program, it can be found in the
standard or a user-defined library, or (when appropriate) it is implicitly defined (see 12.1, 12.4 and 12.8).
An inline function shall be defined in every translation unit in which it is used.
Цитата: Phodopus
3.2.3
Спасибо, вы ответили на мой вопрос.
Для тех кто не дружит с английским:
"Инлайн-функция должна быть определена в той же единице трансляции, где используется"