私はC++でライブラリを書いています。私のライブラリには 2 つのクラスがA
ありB
ます。A()
ライブラリを参照するすべてのコードからコンストラクターを非表示にしたいと考えています。また、クラスがコンストラクターB
を呼び出せるようにしたいと考えています。A()
私は C# のバックグラウンドを持っており、C++ についてはほとんど覚えていません。A()
C# では、コンストラクターを として宣言するだけinternal
です。C++ でこれを行う最も近い方法は、friend
宣言と前方宣言の組み合わせであると読みました。どうすればいいですか?以下に私の3つのファイルを示します。
あ:
#pragma once
class A
{
private:
A();
};
Bh
#pragma once
class A;
class B
{
public:
A createA();
};
B.cpp:
#include "A.h"
#include "B.h"
A B::createA()
{
A result; //cannot access private member declare in class 'A'
return result;
}
これを Ah に追加しようとしました:
public: friend A createA();
代わりに、対応する前方宣言を使用してこれを Ah に追加しようとしました。
public: friend A B::createA();
extern class B;
代わりに、Ah に and を追加して、B を次のようなクラスにしようとしました。
public: friend class B;
私は途方に暮れています。
関数が直接オブジェクトではなくオブジェクトB::createA()
へのポインターを返すようにすると、これは簡単になると思いますが、私の場合はそうではありません。クローズド API をエミュレートしていますが、API 呼び出しはポインターではなくオブジェクトを返します。A
A
A