9

私は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 呼び出しはポインターではなくオブジェクトを返します。AAA

4

4 に答える 4