コピーできないクラスがFoo
あり、そのコンストラクターの1つがたまたまへの参照を受け取ったとしFoo
ます。
class Foo
{
public:
Foo(Foo& parent) {...}
private:
void operator=(Foo); // disabled
...
};
コンパイラーは、これがコピーコンストラクターであると見なしますが、コピーとはまったく関係のないことを行います(したがって、代入演算子は無効になります)。
この方法でコンストラクターを定義することに危険はありますか、またはその署名を人為的に変更する必要がありますか?たとえば、参照の代わりにポインターを使用するか、必須のダミーパラメーターを追加しますか?
ここにいくつかのコンテキストがあります(おそらく私の質問を理解/回答する必要はありません)。
自分で作成したクラスライブラリがあります。これは、ユーザーコードと別のライブラリ間の接続として機能します。もう1つのライブラリは、簡潔にするためにfrobnicateと呼ぶサービスを提供します。ユーザーコードは次のようになります。
class UsefulObject: public mylib::Frobnicator
{
...
void DoStuff()
{
int x = ...
...
frobnicate(x); // it's important to allow simple syntax here
frobnicate(x + 1);
...
}
...
};
ユーザーオブジェクトの階層をサポートしたいと思います。各オブジェクトは別の(その親)に含まれていますが、他のすべてのオブジェクトを含むいくつか(私の場合は5)のトップレベルオブジェクトがあります。
各オブジェクトにはログファイルがあります。各呼び出しを複数のログファイルに記録し、最上位オブジェクトまで包含階層を上に配置したいと思います。
私はそれをこのように実装しました:
namespace mylib
{
class Frobnicator // provides the frobnication service
{
public:
Frobnicator(Frobnicator& parent): parent(parent) {}
protected:
virtual void frobnicate(int x) {
... // some logging code
parent->frobnicate(x);
}
private:
Frobnicator& parent;
};
namespace internal // users of mylib, please don't use this!
{
class TheUltimateFrobnicator: public Frobnicator
{
protected:
virtual void frobnicate(int x) {
the_other_library::frobnicate(x);
}
private:
TheUltimateFrobnicator(int id); // called by a factory or some such
};
}
}