C++ 如何编写两个初始化操作(一个作为默认初始化,另一个作为用户输入)?两者都是class';C+中的s构造函数+;

C++ 如何编写两个初始化操作(一个作为默认初始化,另一个作为用户输入)?两者都是class';C+中的s构造函数+;,c++,class,user-input,class-constructors,C++,Class,User Input,Class Constructors,我正在设计和实现一个类,其中必须使用该类的构造函数包含两个初始化操作。一个是默认初始化(我认为我已经正确地完成了),另一个是来自用户输入的初始化,它应该在构造函数本身中(我仍然很难编写它)。我使用单独的编译,所以我用类和.cpp文件中的主函数显示了文件中的代码。我正在使用Dev-C++,下面是部分代码。谢谢你的帮助 #include <iostream> #include <exception> #include <math.h> ///#include

我正在设计和实现一个类,其中必须使用该类的构造函数包含两个初始化操作。一个是默认初始化(我认为我已经正确地完成了),另一个是来自用户输入的初始化,它应该在构造函数本身中(我仍然很难编写它)。我使用单独的编译,所以我用类和.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;
 }
#包括
#包括
#包括
///#包括“Exception.h”
#ifndef三角形
#定义三角形
使用名称空间std;
阶级三角
{
私人:
双边1;
双面2;
双面3;
双角度侧1侧2;
双角度侧1侧3;
双角度侧2侧3;
公众:
//具有默认初始化的默认构造函数
三角形::三角形():边1(0),边2(0),边3(0),角1边2(0),角1边3(0),角2边3(0)
{
}
//构造函数与用户输入,但我知道有一些错误。。。
三角形::三角形(双s1、双s2、双s3)
{ 
couts2>>s3;
侧1=s1;
侧2=s2;
侧3=s3;

用户必须手动输入值的构造函数是一种可怕的设计。你确定有人告诉你要这样做吗

正确的方法是这样的

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);

   ...

}
按顺序在主函数中输入值,然后将值传递给构造函数

你做事情的方式如此糟糕的原因是它使你的三角形构造函数只能在你正在编写的程序的特定上下文中使用。你应该设计你的类,使它们可以在不同的程序中重用。这可能是你刚开始时很难理解的事情,因为你是f专注于让一个程序运行,而不是考虑将来可能编写的程序


如果真的有人告诉你必须这样做,那么你就是被一个不专业的人教的。

一个用户必须手动输入值的构造函数是一个可怕的设计。你确定有人告诉你要这样做吗

正确的方法是这样的

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);

   ...

}
按顺序在主函数中输入值,然后将值传递给构造函数

你做事情的方式如此糟糕的原因是它使你的三角形构造函数只能在你正在编写的程序的特定上下文中使用。你应该设计你的类,使它们可以在不同的程序中重用。这可能是你刚开始时很难理解的事情,因为你是f专注于让一个程序运行,而不是考虑将来可能编写的程序


如果你真的被告知必须这样做,那么你就是被一个不专业的人教的。

你需要这样做:

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;
 }

您需要这样做:

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;
 }

根据您的任务描述,您需要一个机会来创建对象类实例的不同配置,特定实例的配置取决于用户输入。
因此,作为完成任务的方法之一,我建议您阅读编程模式生成器
类生成器的对象负责创建特定类的实例,它提供了灵活的对象创建和错误预防等优点。我为您编写了一个小示例:

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;
};
类三角形
{
朋友级三角生成器;
公众:
双显示三角形边()
{    
coutm_实例=新三角形(tmp);
}
三角形*getTriangle(空心)
{
返回此->m_实例;
}
私人:
三角形*m_实例;
};

根据您的任务描述,您需要机会创建对象类实例的不同配置
,特定实例的配置取决于用户输入。
因此,作为完成任务的方法之一,我建议您阅读编程模式生成器
类生成器的对象负责创建特定类的实例,它提供了灵活的对象创建和错误预防等优点。我为您编写了一个小示例:

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;
};
类三角形
{
朋友级三角生成器;
公众:
双显示三角形边()
{    
coutm_实例=新三角形(tmp);
}
三角形*getTriangle(空心)
{
返回此->m_实例;
}
私人:
三角形*m_实例;
};

为什么不将
std:cin>>s1>>..
等移到main函数中,然后使用从
std::cin
读取的参数调用构造函数?您可以编写一个std::istream&operator>>(std::istream&is,Triangle&Triangle)函数。然后您可以编写类似std::cin>>三角形的内容。为什么不将
std:cin>>s1>>..
等移到主函数中,然后使用从
std::cin
读取的参数调用构造函数?您可以编写std::istream&operator>>(std::istream&is,Triangle&Triangle)函数。然后你可以写一些类似STD::CIN>三角感谢你的答案。我将尝试在每次使用代码时考虑重新可用性。再次感谢!@ T4000如果你能做到这一点,你会得到好的分数。C++的面向对象语言的最初动机之一是提高可重用性。代码。谢谢你回答的清晰。每次我写代码时,我都会试着从可重用性的角度考虑。再次感谢!@T4000如果你能做到这一点,你会得到很好的分数。最初的动机之一