←検索窓の楽しみ方
  ショッピングモール  掲示板ランキング


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4654

文脈依存でコンストラクタをどうにかしたいのですが...
投稿者---初心者(2005/09/26 23:33:06)


前の質問とは別ではありますが,
連続の質問マズければ御指摘頂ければ幸いです.

自作で実数係数多項式クラスPolynomialを作成しております.
多項式a0+a1x+a2x2+...anxn
の次数nは可変で,クラスのメンバデータは
係数列を表すdouble *Elementと
係数の数(=次数+1)を表すint Sizeです.

Polynomialクラス同士の加減乗算はもちろんのこと,
double型オブジェクトとの加減乗算も可能とし,
main関数では次のように書けるとします:

Polynomial x(2); //係数の数が2個の多項式オブジェクトx
x[0]=1.0; x[1]=2.0; //各係数を設定
x+1.2; //Polynomialオブジェクトとdouble型オブジェクトの加算
2.3+x; //double型オブジェクトとPolynomialオブジェクトの加算


安直な実装は次のようになると思われます:
class Polynomial{
  int Size;
  double *Element;
  public:
  Polynomial(int arg): Size(arg), Element(new double[arg]){}
  Polynomial(double arg): Size(1), Element(new double[1]){
    Element[0]=arg;
  }
  double &operator[](int arg){return Element[arg]}
  
  //コピーコンストラクタ,代入演算子もあるとします.
};

Polynomial operator+(const Polynomial &lhs, const Polynomial &rhs){
  //省略します.
}


このとき,main関数で

x+3;

のように書くと,
多項式オブジェクトxと
3個の係数を持つ,得体の知れない多項式オブジェクトとの
加算が行われてしまいます.

次のように幾つか考えてみたのですが,
御意見頂ければ幸いです.

[選択肢1]
コンストラクタPolynomial::Polynomial(double arg)を排除し,
operator+(const Polynomial &, const Polynomial &)とは別に,
operaror+(double, const Polynomial &)を作成すると,
インタフェースも代わらず,また,

3+x;

については,
3が3.0に変換されてoperator+(double, const Polynomial &)
が呼ばれるのですが,
operator+は一つの実装で済ませられないのかなと思っております.

[選択肢2]
ユーザにルール「x+3;と書かずにx+3.0;と書く!」を守らせれば
良いのかも知れませんが,
コンパイル時にルール違反を告知できません.

[選択肢3]
コンストラクタPolynomial::Polynomial(int arg)を削除して,
代わりに
Polynomial::set_size(int arg){Size=arg; Element=new double[arg];}
を作成し,main関数では
Polynomial x; x.set_size(4);
とすれば,ひとまずこの問題を排除できますが,
スマートではないような気がします.

何か解決方法があれば教えて頂ければ幸いです.


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文脈依存でコンストラクタをどうにかしたいのですが... 4655 かずま 2005/09/27 02:31:56
<子記事> Re:文脈依存でコンストラクタをどうにかしたいのですが... 4657 iijima 2005/09/27 02:44:57


No.4655

Re:文脈依存でコンストラクタをどうにかしたいのですが...
投稿者---かずま(2005/09/27 02:31:56)


> 何か解決方法があれば教えて頂ければ幸いです.

explicit を使えばよいのでは?
#include <iostream>

class Polynomial {
    int Size;
    double *Element;
public:
    explicit Polynomial(int arg) : Size(arg), Element(new double[arg]) {
        std::cout << "Polynomial(int)\n";
    }
    Polynomial(double arg) : Size(1), Element(new double[1]) {
        std::cout << "Polynomial(double)\n";
        Element[0] = arg;
    }
    double &operator[](int arg) { return Element[arg]; }
    //コピーコンストラクタ,代入演算子もあるとします.
};

Polynomial operator+(const Polynomial &lhs, const Polynomial &rhs)
{
     //省略します.
}

int main()
{
    Polynomial x(2);
    x[0] = 1.0; x[1] = 2.0;
    x + 3;
}



この投稿にコメントする

削除パスワード

No.4660

Re:文脈依存でコンストラクタをどうにかしたいのですが...
投稿者---初心者(2005/09/27 03:11:29)


お返事を有難うございます.

>explicit を使えばよいのでは?

なるほど!

explicitについては書籍で目にしたことがある程度で使うことがなく,
使い方も良く分かっておりませんでした.

コードを掲載して下さいまして有難うございます.


この投稿にコメントする

削除パスワード

No.4657

Re:文脈依存でコンストラクタをどうにかしたいのですが...
投稿者---iijima(2005/09/27 02:44:57)


> x+3;
> のように書くと,
> 多項式オブジェクトxと
> 3個の係数を持つ,得体の知れない多項式オブジェクトとの
> 加算が行われてしまいます.

得体が知れないわけではありません。
Polynomialクラスにはint型の引数1個のコンストラクタがあるので、それによって生成されたオブジェクトが右オペランドに渡されるのです。
そのコンストラクタにexplicitキーワードをつければ、とりあえずはお望みの動作になるでしょう。

explicit Polynomial(int arg) ...

しかし、double型の引数をとるコンストラクタを定義することによって、double型とPolynomial型の加算も

Polynomial operator + ( const Polynomial&, const Polynomial& );

で行わせようというのは、ややトリッキーに感じます。
このプロトタイプからは、double型をオペランドにできることが読み取れないからです。

私なら、double型の引数をとるコンストラクタを削除し、

Polynomial operator + ( double, const Polynomial& );
Polynomial operator + ( const Polynomial&, double );

を追加することを選びますね。


>前の質問とは別ではありますが,
>連続の質問マズければ御指摘頂ければ幸いです.

連続の質問は構わないでしょう。
ただ、ここは「C言語」関係の掲示板ですから、C++言語の話題は控え目にするのが良いと思います。


この投稿にコメントする

削除パスワード

No.4661

Re:文脈依存でコンストラクタをどうにかしたいのですが...
投稿者---初心者(2005/09/27 03:23:56)


お返事有難うございます.

>そのコンストラクタにexplicitキーワードをつければ、とりあえずはお望みの動作になるでしょう。
>
>explicit Polynomial(int arg) ...

御指摘のように私の意図自体が正しいかはさておけば,
私の意図そのものをexplicit宣言で実現できることが分かって嬉しいです.
有難うございました.

>私なら、double型の引数をとるコンストラクタを削除し、
>
>Polynomial operator + ( double, const Polynomial& );
>Polynomial operator + ( const Polynomial&, double );
>
>を追加することを選びますね。

なるほど.
ライブラリ(なんて大層なものではないですが...)作成もまた
手間が少ない方が良いと漠然と思っていた私には新鮮な御意見でした.
そのような感覚を身につけられるよう精進したいと思います.
有難うございました.

>ただ、ここは「C言語」関係の掲示板ですから、

そうでした.
それにも関わらず丁寧なお返事を書いて下さいまして有難うございました.>お答え下さった皆様

>C++言語の話題は控え目にするのが良いと思います。

今後は,適切な内容の質問をするように致します.
有難うございました.


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity