Я сталкивался с кодом, в котором есть два класса, которые должны быть конвертируемыми между собой, и проект должен был обеспечить конструктор с одним аргументом для каждого класса, принимающего другой класс, например, в файле A.hpp
class B;
class A
{
explicit A( const B& );
...
};
и B.hpp
class A;
class B
{
explicit B( const A& );
...
};
, которые вводят круговую зависимость между двумя классами (чего я бы предпочел избежать, но, возможно, это не имеет большого значения).Есть ли лучший дизайн? другой дизайн будет иметь другой класс преобразователя, который мог бы выполнять эту работу, например, в C.hpp
#include "A.hpp"
#include "B.hpp"
class C
{
static A toA( const B& );
static B toB( const A& );
...
};
или в функциях области имен, например, в D.hpp
#include "A.hpp"
#include "B.hpp"
namespace D
{
A toA( const B& );
B toB( const A& );
...
}
но я не уверен, что один из них лучше .Есть ли явно лучшая альтернатива любому из этих решений?