A, B ( songyuanyao ), A B.
, , . friend-limited-by-inheritance factory , . , .
A.h
#ifndef A_H
#define A_H
#include "B.h"
using namespace std
class A
{ public:
A();
shared_ptr<B> CreateBInstance( const B::ENUM_STANDARD_COLORS );
shared_ptr<B> CreateBInstance( const string );
private:
unique_ptr<map<int, shared_ptr<B>>> UPTR__BInstancesMap;
}
#endif
A.cpp
#include "A.h"
#include "BFactory.h"
...
shared_ptr<B> A::CreateBInstance( const B::ENUM_STANDARD_COLORS enum__StandardColor )
{ unsigned int uint__BInstancesMapIndex = UPTR__BInstancesMap->size();
shared_ptr<B> sptr__BInstance = BFactory::CreateBInstance( uint__BInstancesMapIndex, enum__StandardColor );
UPTR__BInstancesMap->insert( uint__BInstancesMapIndex, sptr__BInstance );
return sptr__BInstance;
}
shared_ptr<B> A::CreateBInstance( const string str___CustomColor )
{ unsigned int uint__BInstancesMapIndex = UPTR__BInstancesMap->size();
shared_ptr<B> sptr__BInstance = BFactory::CreateBInstance( uint__BInstancesMapIndex, str___CustomColor );
UPTR__BInstancesMap->insert( uint__BInstancesMapIndex, sptr__BInstance );
return sptr__BInstance;
}
...
B.h
#ifndef B_H
#define B_H
using namespace std
class B
{ public:
enum class ENUM_STANDARD_COLORS : unsigned int
{ ...
};
~B();
protected:
static unique_ptr<B> CreateBInstance( const unsigned int, const ENUM_STANDARD_COLORS );
static unique_ptr<B> CreateBInstance( const unsigned int, const string );
private:
B( const unsigned int );
}
#endif
B.cpp
#include "B.h"
...
unique_ptr<B> B::CreateBInstance( const unsigned int uint__BInstancesMapIndex, const ENUM_STANDARD_COLORS enum__StandardColor )
{ unique_ptr<B> uptr__BInstance = unique_ptr<B>( new B( uint__BInstancesMapIndex ) );
uptr__BInstance->SetColor( enum__StandardColor );
return uptr__BInstance;
}
unique_ptr<B> B::CreateBInstance( const unsigned int uint__BInstancesMapIndex, const string str___CustomColor )
{ unique_ptr<B> uptr__BInstance = unique_ptr<B>( new B( uint__BInstancesMapIndex ) );
uptr__BInstance->SetColor( str___CustomColor );
return uptr_BInstance;
}
...
BFactory.h
#ifndef BFactory_H
#define BFactory_H
#include "B.h"
class BFactory : private B
{ friend class A // Friend declaration moved from class B.
};
#endif
:
1) A B.
2) B factory , BFactory , BFactory .
3) BFactory - B , ; B factory A .
4) A BFactory B, B.
A factory B, BFactory - .