2016-04-16 9 views
2

私はC++でクラスを持っている、「お客様」と言うと、私はIDのためにそれのメンバーを持ちたい、デフォルトのコンストラクタ

private: 
const string x; // Customer's ID 

今通常のコンストラクタは次のようになります。

ここで、xを初期化せずにデフォルトコンストラクタを構築したいとします。出来ますか?もし私がそれを何らかのランダムな値に初期化すると、 "無題"と言うと、それはそのconstのためにもう変更できません。

デフォルトのコンストラクタをまったくビルドしないでください。そうでないと、xを初期化せずに後で行うことができますか?

+0

すべてconstメンバはコンストラクタで初期化されなければなりません。あなたは 'Customer():x(" Some default String "){}'を実行することができますが、それが必要なものかどうかはわかりません。後でそれを本当に変更する必要がある場合は、単に 'const'にすることはできません。もう一つの**危険な**オプションは 'const_cast'を使うことです。 – DarthRubik

+1

矛盾する要件は、現在のデザインの方向がうまくいかないことを意味します。デフォルトのコンストラクタを導入して解決しようとしている問題は何ですか?デフォルトのコンストラクタは、オブジェクトを宣言して後で変更するためによく使われますが、 'const'データメンバを使ってクラスを意味のある方法でコピーすることはできません。 –

+0

あなたが望むものが「後で修正できるかもしれないconstメンバ」であれば、あなたは本当にconstメンバを必要としません。 – molbdnilo

答えて

2

ここで、xを初期化せずにデフォルトコンストラクタを作成したいとします。出来ますか?

いいえ、不可能です。

私はいくつかのランダムな値に初期化すると、 "無題"と言うので、私はもはやそれを変更することはできません。

これはまさにconstの目的です。

デフォルトのコンストラクタを作成しないでください。それとも、xを初期化せずに後で行うことができますか?

まあxが本当に(私は実際に必要とされている疑い)constする必要があるかどうかを、いくつかのconstexprから一意xを初期化するために管理することができない限り、あなたは、デフォルトのコンストラクタを提供するべきではありません。

+0

ありがとう、私は本当に "プロ"プログラミングの一種であり、本当に馬鹿なプログラミングであることを本当に理解するためにC++をもっと学ぶ必要があります。この課題の全体的なポイントは、「良い」プログラマであることです。そのため、私はこれらのことに非常に時間を費やしています。 –

0

技術的には、後で変更することはできますが、それは良い考えではありません。

Customer() : x("") { } 

をし、後でそれを変更します。

const string s = ""; 
*const_cast<string*>(&s) = "new string"; 

あなたのコードでこれを使用するには、次のようにパラメータなしのコンストラクタを作成することができます:あなたは、このコードでは良い長い時間の一見のためにそれについて考えた後あなたのコードで:

*const_cast<string*>(&x) = "new string" 

実際にはこれは悪い考えかもしれませんが、あなたはこれに別の方法としては、クールな構造体を作成することで、この

の危険性についての詳細はthis postをご覧ください:

template<class T> 
class OneTimeAssign{ 
     T data; 
     bool alreadyAssigned; 
    public: 
     OneTimeAssign() : data(), alreadyAssigned(false){ } 
     void operator=(T&& newData){ 
      if (alreadyAssigned) throw "Error"; 
      data = newData; 
      alreadyAssigned = true; 
     } 
     operator const T&() const{ 
      return data; 
     } 
     const T* const operator->(){ 
      return &data; 
     } 
}; 

あなたは、このようにそれを使用することができます。

OneTimeAssign<std::string> Mine; 
Mine = "First assign"; 
//Mine = "Second assign"; //Runtime Error 
std::cout << (std::string)Mine << std::endl; 
system("pause"); 
+0

_'const_cast'_あなたは深刻ですか? –

+0

私はそれはおそらく悪い考えだったと言っていた....私はしませんでした。 – DarthRubik

+0

まあ、技術的な説明は正しいです。しかし、このようなものは実際に使用されるべきではないと述べたように。 –

関連する問題