デフォルトを使用して値を初期化し、そのベースをいくつかの特殊なコンストラクターに拡張する「ベース」コンストラクターを定義する方法を探しています。
私が欲しいものの擬似コードは次のようになります。
class Foo{
private:
int val;
/* ... */
public:
// Base constructor
Foo(){ /*...*/ } // This provides basic initialization of members
// Named constructors
static Foo fromString(string s){
Foo f; // Call base constructor
f.val = s.length(); // Customize base object
return f; // Return customized object
}
static Foo fromInt(int v){
Foo f;
f.val = v;
return f;
}
}
最初は、一時的なの有効期間を延長するf
ことを考えましたが、const宣言により、そのメンバーを編集できません。だから、これは出ているようです。
次に、 「名前付きコンストラクター」アプローチ(上に表示)を試しました。ただし、最初にオブジェクトを作成するために例を変更し、次にそれを変更してから返す必要がありました。f
これは機能しているように見えますが、これは一時的なものであり、関数の最後で範囲外になるため、これは単なる偶然であると合理的に確信しています。
sのようなものを使用することも検討しましauto_ptr
たが、Fooオブジェクトとs to Fooの両方を使用しているauto_ptr
ため、残りのコードは、オブジェクトがベースコンストラクターを介して作成されているかどうかを「気にします」(この場合)。オブジェクト)または拡張コンストラクターの1つを介して(この場合はポインターになります)。
それが役立つ場合は、Pythonで次のようなものを使用します。
class Foo(object):
def __init__(self):
/* Basic initialization */
@classmethod
def fromString(cls, s):
f = Foo() #†
f.val = len(s)
return f
最後に、私がこのようにしたい理由は2つあります。
- コードの再利用。共通の初期化を各コンストラクターから1つに移動したいと思います。これは、各コンストラクターによって呼び出される-typeプライベートメソッドを介して実行できることに気付き
init()
ましたが、これについて言及したかっただけです。 - 明確性とあいまいさの解決。名前付きコンストラクターの例の動機と同様に、パラメータータイプだけでは、どのctorを使用するかを決定するのに十分ではありません。さらに、
fromSomething
構文は優れた明快さを提供します。
簡単な解決策があれば許してください。私の仕事は過去数年間でc++からJava/Pythonに移行しているので、少し錆びています。