2016-05-03 10 views
-3

で過負荷には、私はそのようなクラスが必要です。実際に私が必要とするのは、2つのバージョンのコンストラクタを持つことです。私の例では2番目のコンストラクタのようなデフォルト値を持つオブジェクトを作成し、もう1つは同じクラスで内部的に使用されるパラメータを持たないデフォルト/未加工/未初期化オブジェクトを作成するものです。私はこの問題を乗り越えるために次の操作を行うことができます呼び出すデフォルトコンストラクタの代わりに、デフォルトパラメータ

class MyClass 
{ 
    MyClass(float) 
    { 
    } 

    public: 
    MyClass(signed = 0) 
    { 
    } 
} 

そして、私のクラス内の最初のコンストラクタを呼び出すために、それは、未使用のパラメータを持っている奇妙です。

+0

'のBigInt()' 'MyClass'のコンストラクタではありません。あなたはそのコードでコンパイラエラーを取得します。 –

+0

'BigInt'はこのクラスのコンストラクタではなく、メンバ関数であり戻り値が必要です。 –

+0

はい、私の間違いです。それを修正しました。 – OmegaDoom

答えて

0

あなたはいくつかの選択肢があります。あなたの「回避策」は狂気ではなく、実際には状況によっては奨励されるパターンです。しかし、代わりに名前付きコンストラクタのイディオムを考える:あなたは同じクラスのメンバ関数で初期化されていないオブジェクトを作成する必要がある場合は、あなたのためにこれを実現するという名前のプライベートc'tor作成:

class MyClass { 
public: 
    MyClass(float f = 0.) : value_{f} {} 
private:  
    float value_; 

    void g(); 
    MyClass invalid() 
    { 
    return MyClass{std::numeric_limits<float>::max()}; } 
}; 

をする方法を、 MyClass::g()の内側に、あなたが行うことができます:

void MyClass::g() 
{ 
    auto newObj = invalid(); // call named c'tor 
    newObj.value_ = 3.14159; 
    std::swap(newObj, *this) // swap current object with 'newObj' 
    // or whatever. 
} 
+0

しかし、私は避けたいMyClass(float)を呼び出します。私はこの問題をどのように解決するのか分かりません。私はネストされたプライベート構造を作成し、プライベートコンストラクタを定義しました。とにかく私の意見では奇妙に見えます。 – OmegaDoom

+0

これを回避する方法はありません。コンパイラは、引数がデフォルト値を持つc'torと引数を受け取らないc'torを呼び出していることを知ることはできません。 C++によれば、いずれかがデフォルトのc'tor ...であり、1つだけ存在する必要があります。あなたの問題への解決は、どちらの場合にも唯一のデフォルトc'torを使用するか、または1つの引数c'torのデフォルト値を削除することです。 – KyleKnoepfel

+0

私はそれが03とおそらくC++ 11の標準では可能ではないことを知っていますが、それが新しい標準で変更されているのか、おそらくもっと良い解決策が私のものよりあるのだろうかと思いました。それでも、そんなことはないと私に安心してくれてありがとう。ただ一つのこと。私は、実際に理解することなく質問を判断する決定が非常に早い人もいることを知っています。これらの人々がこの1つを好まなかったので、今私はもう質問を投稿できません。 – OmegaDoom

関連する問題