iはFoo
、 とそのコンストラクタの1だけでFoo
への参照を受け取るために起こるコピー不能クラスがあるとします。それはコピーとは全く関係のない何かをしながらは、コンストラクタはFoo :: Fooのはfooへの参照を受け取るが、コピーコンストラクタではない
class Foo
{
public:
Foo(Foo& parent) {...}
private:
void operator=(Foo); // disabled
...
};
コンパイラが(そう代入演算子が無効になっている)、これはコピーコンストラクタ、 だと思います。
このようにコンストラクタを定義する際には、 の危険性がありますか、その署名を人為的に変更する必要がありますか?参照の代わりにポインタ、 を使用するか、または必須のダミーパラメータを追加しますか?
ここにいくつかの文脈があります(私の質問を理解する/答えなくてもいいかもしれません)。
自分で書いたクラスライブラリ は、ユーザーコードと別のライブラリの間の接続として機能します。 他のライブラリは簡潔にするためと書かれたサービスを提供しています。 ユーザーコードは次のようになります。
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
};
}
}
"コンパイラはこれがコピーコンストラクタであると考えています"。あなたがコピーをしたくない場合でも、定義上、コピーコンストラクタです。 –