2016-08-12 10 views
1

これはおそらく簡単な質問ですが、解決するための良い方法はありません。問題は、私はインスタンスのシリーズを構築したいが、渡された値が唯一できることです実行時に 'const'パラメータを持つクラスを構築する

MyClass(const double value); 

:私は、次のような、コンストラクタのconstを必要とし、そのパラメータとしてを倍増するクラスを、持っているAPIを使用しています実行時に認識されます。

より明確に、ここで私がやっていることです:実行時に

.hファイル

std::vector<MyClass> my_class_vec; 
std::vector<double> my_value_vec 

、私は、値が割り当てられmy_value_vecを作るために取得することができます。私はmy_class_vec構築するために、これらの値を使用したい:

.cppファイルを

for(int i = 0; i < my_value_vec.size(); i++) 
    my_class_vec(my_value_vec[i]); 

私はのconstダブルパラメータとしてダブルを渡すことはできませんので、私は、これは間違っている知っています。また、インスタンス構築にも間違った使い方がありますが、私が望むことをする良い方法は見つけられません。誰にもアイデアはありますか?私はあなたの意見に本当に感謝しています。

+0

"*私はconst doubleパラメータとしてdoubleを渡すことができないので*" ...どうしてですか?つまり、コードがコンパイルされていない理由とは何の関係もありません。 –

+0

ありがとう@ニコルボラス! – Willie

答えて

0

これは間違っている、しかし、のためにまったく異なる理由。まずはdoubleconst double parameterとして渡すことができます。

void foo(const double b) 
{ 
} 

double c; 

void bar() 
{ 
    foo(c); 
} 

これは何の問題もなくコンパイルされます。 constが指定するのは、の場合です。は、関数foo()はそのパラメータを変更できません。それでおしまい。それは、渡された値が一定であるか可変であるかに関係なく、まったく関係しません。呼び出し元は、doubleまたはconst doubleのいずれかをパラメータとして渡すことができます。このパラメータは値渡しです。これは、呼び出された関数に対して、すべての場合にパラメータのコピーが作成されることを意味します。コピーはdoubleまたはconst doubleから来ても差し支えありません。

あなたの問題はまったく異なります。ベクトルを構築しようとする試みは根本的に間違っています。

std::vector<MyClass> my_class_vec; 
std::vector<double> my_value_vec; 

my_class_vecはベクターである。

my_class_vec(my_value_vec[i]); 

これはstd::vectorがここで呼び出されているoperator()を実装していないという単純な理由のためにコンパイルされません。 my_class_vec(something)はベクトルに何も追加しません。そんなことはない。これは何も構成しません。これは、オブジェクトとしてdoubleをパラメータとして渡して、operator()を呼び出しようとします。 std::vector()演算子を実装していないため、これはコンパイルに失敗します。

現代のC++を使用して、あなたのサンプルベクトルを初期化する正しい方法は:

for (const auto &value:my_value_vec) 
    my_class_vec.emplace_back(value); 

これはmy_class_vecが空であることを前提としています。 emplace_back()は、ベクトルの後端に新しい値を作成し、コンストラクタにdoubleのvalueを渡します。これは範囲の反復でconst修飾子の有無に関係なく機能することに注意してください。

+0

@Sam Varshavchikありがとう、今私はクラスベクトルを構築するために間違った方法を使用することを知っている。しかし私のコンパイラはstd :: vectorを表示しますには "emplace_back"という名前のメンバーはありません。私は何かが欠けていますか? – Willie

+0

コンパイルにC++ 11を使用した後、この問題は解決しました。もう一度感謝します! – Willie

0

私はdoubleをconst doubleパラメータとして渡すことができないためです。

もちろん問題はありません。

問題は、あなたがmy_value_vec[i]の値に応じてmy_class_vecに要素を追加したい場合、あなたは(C++ 11以降)std::vector::emplace_backを使用することができ、およそmy_class_vec(my_value_vec[i]);です:

my_class_vec.emplace_back(my_value_vec[i]); 
+0

@songyuanyaoありがとう、問題は解決しました! – Willie

関連する問題