0

クラスのコンストラクターを使用して 2 つの初期化操作を含める必要があるクラスを設計および実装しています。1つはデフォルトの初期化(私は適切に行ったと思います)であり、もう1つはコンストラクター自体にあるはずのユーザー入力からの初期化です(まだ書くのに問題があります)。私は個別のコンパイルを使用しているので、.cpp ファイルのクラスとメイン関数を含むファイルのコードを示します。私は Dev-C++ を使用しており、コードの一部を以下に示します。ご協力いただきありがとうございます。

#include <iostream>
#include <exception>
#include <math.h>


///#include "Exception.h"


#ifndef TRIANGLE_H
#define TRIANGLE_H

using namespace std;

class Triangle

{
   private:
       double side1;
       double side2;
       double side3;

       double angle_side1_side2;
       double angle_side1_side3;
       double angle_side2_side3;


  public:
    //default constructor with default initialization   
    Triangle::Triangle(): side1(0), side2(0), side3(0), angle_side1_side2(0), angle_side1_side3(0), angle_side2_side3(0)
       {

       }

//constructor with user inputs, but I know there is something wrong...
Triangle::Triangle(double s1, double s2, double s3)
  { 
   cout<<"enter your own values:"<<endl;
   cin>>s1>>s2>>s3;
   side1=s1;
   side2=s2;
   side3=s3;
   cout<<"the current lengths of sides of your triangle are: " <<endl;
  }

 double display_triangle_sides()
   {    
        cout<<side1<<" "<<side2<<" "<<side3<<" ";                               

   }

 double display_triangle_Area()
   {    
        double S=(side1+side2+side3)/2; //semiperimeter
        double T=sqrt(S*(S-side1)*(S-side2)*(S-side3));      //Heron formula to calculate Area of triangle

       return T;
   }
};

endif


     //*****************************main function below************************

 #include <iostream>
 #include <exception>



 #include "Untitled1.h"


 using namespace std;

 int main()
 {


  Triangle tr;


  cout<<" length of each side of the current triangle : ";
  tr.display_triangle_sides();  //I want to show here the values entered by the users



  cout<<endl<<"Here is the Area of the current triangle : " <<    tr.display_triangle_Area()<<endl;
  cout<<"type of triangle:"<<endl;
  tr.Type_of_Triangle();


   system("Pause");
   return 0;
 }
4

3 に答える 3

3

ユーザーが手動で値を入力しなければならないコンストラクターは、ぞっとするようなデザインです。そうするように言われたのは確かですか?

これを行う正しい方法は、次のようなものです

class Triangle
{
    Triangle::Triangle(): side1(0), side2(0), side3(0)
    {
    }

    Triangle::Triangle(double s1, double s2, double s3) : side1(s1), side2(s2), side3(s3)
    { 
    }

    ...

};

int main()
{
   double s1, s2, s3;
   cin >> s1 >> s2 >> s3;
   Triangle t(s1, s2, s3);

   ...

}

つまり、メイン関数に値を入力し、その値をコンストラクターに渡します。

あなたのやり方が非常に悪い理由は、あなたが今書いているプログラムの特定のコンテキストでしか Triangle コンストラクターを使用できないようにするためです。異なるプログラムで再利用できるように、クラスを設計する必要があります。始めたばかりのあなたにとって、これを理解するのはおそらく難しいことです。なぜなら、あなたは 1 つのプログラムを動作させることに集中しており、将来作成する可能性のあるプログラムについては考えていないからです。

あなたが本当にこれをしなければならないと言われているなら、あなたは無能な人から教えられています.

于 2012-10-12T07:14:31.480 に答える
1

次のようにする必要があります。

int main()
 {

  cout<<"enter your own values"<<endl;
  double s1,s2,s3;
  cin>>s1>>s2>>s3;
  Triangle tr(s1,s2,s3);

  cout<<" length of each side of the current triangle : ";
  tr.display_triangle_sides();  //I want to show here the values entered by the users



  cout<<endl<<"Here is the Area of the current triangle : " <<        tr.display_triangle_Area()<<endl;
  cout<<"type of triangle:"<<endl;
  tr.Type_of_Triangle();


   system("Pause");
   return 0;
 }

コンストラクターも変更します

//constructor with user inputs, but I know there is something wrong...
Triangle::Triangle(double s1, double s2, double s3):side1(s1),side2(s2)side3(s3)
  { 
  }
于 2012-10-12T07:15:26.280 に答える
0

タスクの説明によると、オブジェクトクラスインスタンスのさまざまな構成を作成する機会が必要です。特定のインスタンスの構成は、ユーザー入力によって異なります。
ですから、あなたのタスクに取り組む方法の1つとして、プログラミングパターンビルダーについて読むことをお勧めします。
クラスビルダーのオブジェクトは、特定のクラスのインスタンスの作成を担当し、柔軟なオブジェクトの作成やエラー防止などの利点を提供します。私はあなたのために小さな例を書きました:

class Triangle
{
    friend class TriangleBuilder;
public:
    double display_triangle_sides()
    {    
        cout<<side1;                               
    }
private:
      double side1;
      Triangle::Triangle(): side1(0){}
      Triangle::Triangle(int v): side1(v){}



};
class TriangleBuilder
{
public:
    void BuildDefaultTriangle(void)
    {
        this->m_instance = new Triangle;
    }
    void BuildCustomTriangle(void)
    {
        cout << "All right!! Enter side length)\n" << endl;
        int tmp;
        cin >> tmp;
        this->m_instance = new Triangle(tmp);
    }
    Triangle* getTriangle(void)
    {
        return this->m_instance;
    }
private:
    Triangle* m_instance;
};
于 2012-10-12T07:34:17.773 に答える