Как написать две операции инициализации (одна как инициализация по умолчанию, а другая как пользовательский ввод)? Оба являются конструкторами класса в переполнении стека

Я занимаюсь проектированием и реализацией класса, в котором я должен включить две операции инициализации, используя конструкторы класса. Одна из них — инициализация по умолчанию (которую, я думаю, я сделал правильно), а другая — инициализация с пользовательского ввода, который должен быть в самом конструкторе (где у меня все еще есть проблемы с его записью). Я использую отдельную компиляцию, поэтому я показываю код из файла с классом и основной функцией из файла .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 userscout<<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;
}

0

Решение

Конструктор, в котором пользователь должен вводить значения вручную, ужасает дизайн. Вы уверены, что вам сказали сделать это?

Правильный способ сделать это что-то вроде этого

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 пригодным для использования только в конкретном контексте программы, которую вы сейчас пишете. Вы должны разработать свои классы так, чтобы они многоразовый в разных программах. Вероятно, вам трудно оценить это сейчас, когда вы только начинаете, поскольку вы сосредоточены на том, чтобы заставить работать только одну программу, а не думать о программах, которые вы могли бы написать в будущем.

Если вам действительно сказали, что вы должны это сделать, то вас обучает некомпетентный человек.

3

Другие решения

Вам нужно сделать так:

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

Также измените consrtructor на

//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)
{
}
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;
};
0