dポイントプレゼントキャンペーン実施中!

次のようなプログラムを作ろうとしています。
あるクラスComponentは
DIM(整数)次元(要素数)のdouble型配列と
ここで DIM は別のところでconstで宣言されています。
(他にもいくつか変数を持っているのですが話に関係ないので割愛します)
とりあえずこんな感じにしたいです。

class Component{
public:
double x[DIM];

Component(double x,double y,double z, ,,,,,); //コンストラクタ
}

ここでコンストラクタComponentは引数にDIM個の実数をとり、たとえば
DIM = 3のとき

Component obj(1.0,2.0,3.0);

と宣言したら
obj.x[0]=1.0
obj.x[1]=2.0
obj.x[2]=3.0
となるようにしたいのです。
むろん代入すること自体は代入すればよいのですが
外で宣言されているDIMによってコンストラクタの引数の数が変わってしまいます。
こういう時はどのような解決策があるでしょうか。
今書いたのと全然違うやり方でもかまいません。
(ただ何個も何個もコンストラクタをオーバーロードするのは避けたいです。
いろんなDIM次元で実験がしたく、きりがありません)。

よろしくお願いいたします!

A 回答 (3件)

型のチェックがゆるくなりますが、可変長引数使って:



template <std::size_t DIM>
class Component {
public:
  Component(double arg0, ...)
  ...
    • good
    • 0
この回答へのお礼

可変長引数、調べてみました。こんなすばらしいやり方があるのですね。
どうにかできそうです。ありがとうございました。

お礼日時:2008/06/26 01:56

こういうのは、



template <std::size_t DIM>
class Component
{
public:
 template <class InputIterator>
  Component(InputIterator first, InputIterator last);
 ...
};

とするのが常套手段ではないでしょうか?
    • good
    • 0
この回答へのお礼

そういうやりかたがあるのですか。
sizt_t DIMというのはどういう意味があるものなのでしょうか。
もう少し勉強が必要なようです。ありがとうございました!

お礼日時:2008/06/26 01:55

引数の値はそれぞれ独立して渡す必要はありますか?


でなければ、あまりスマートとは言えませんが、
引数の要素は一旦配列に格納し、ポインタで配列の先頭アドレスと要素数を渡し、
コンストラクタ内で要素数分の領域を確保して引数で渡したポインタに紐漬けられた値を代入すればいいのでは?
ついでに要素数もメンバ変数に保存しておけば、以降のループ処理(あれば)のリミッタとしても使用できますよ。
あと、デストラクタでの領域解放は忘れずに。
    • good
    • 0
この回答へのお礼

なるほど、僕にもとてもわかりやすい方法です。
ありがとうございました!

お礼日時:2008/06/26 01:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!