nik*_*nik 13 c++ constructor if-statement class object
我正在学习c ++,而我刚刚学习了面向对象的章节.我有一个关于在if语句中创建对象的问题.
我正在处理的问题是创建一个将显示报告标题的类.该类有一个默认构造函数,它将公司名称和报告名称设置为泛型,并且如果用户需要,还有一个带有两个参数的构造函数(字符串公司名称和报告名称).
问题是,具体而言,"双参数默认构造函数应该允许在创建新的Report对象时指定这些[公司和报告名称].如果用户创建Report对象而不传递任何参数,请使用默认值值.否则,使用用户指定的名称值."
所以我的问题是,如何创建这些对象?我理解如何创建一个没有任何参数的对象(即Report newobj;),以及参数(即Report newobj(string string);).基本上,我首先了解如何在main函数的顶部创建这些对象.但是可以根据用户选择在if语句中创建它们吗?这是我迄今为止所拥有的,显然,它不起作用:
#include <iostream>
#include <string>
#include "report.h"
using namespace std;
bool enter_company_name(); // return true if user wants to enter company name
bool print_form(); // return true if user wants to print in formatted output
int main()
{
string company_name,
report_name;
bool name = false,
format = false;
name = enter_company_name();
format = print_form();
if (name)
{
cout << "Enter company name: ";
getline(cin, company_name);
cout << "Enter report name: ";
getline(cin, report_name);
Report header(company_name, report_name); // THIS IS MY PROBLEM
}
else
Report header; // THIS IS MY PROBLEM
if (format)
header.print_formatted();
else
header.print_one_line();
return 0;
}
bool enter_company_name()
{
char choice;
cout << "Do you want to enter a name?\n>";
cin >> choice;
if (choice == 'y' || choice == 'Y')
return true;
else
return false;
}
bool print_form()
{
char choice;
cout << "Do you want to print a formatted header?\n>";
cin >> choice;
if (choice == 'y' || choice == 'Y')
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
所以我想使用默认值创建一个对象(如果没有指定),或者如果给出了选择,则创建一个带有用户值的对象.我只是无法弄清楚如何在c ++中以交互方式进行.到目前为止,我无法在任何地方找到任何类似的问题.
我遇到的最接近的事情是使用指针来做类似于我想做的事情,但是我正在使用的书还没有得到指针,我想试着找出一种方法来做到这一点在我正在工作的章节的范围内(即不使用指针).
我没有包含头文件或类实现文件,因为我不认为它们在这里是相关的.
先感谢您!
Die*_*ühl 15
首先,您不能在条件语句中创建对象并在条件语句之后使用它:条件语句的两个分支每个都创建一个范围,并且在其中创建的任何对象都销毁了分支的末尾.也就是说,你需要提出一种不同的方法.最简单的方法可能是将对象的创建委托给一个函数,该函数根据需要返回对象:
Report makeReport() {
if (enter_company_name()) {
...
return Report(name, company);
}
return Report();
}
...
Report report = makeReport();
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用三元运算符来条件地创建Report
这样或那样的方式:
bool get_company_name = enter_company_name();
std::string name(get_company_name? read_name(): "");
std::string company(get_company_name? read_company(): "");
Report report = get_company_name? Report(name, company): Report();
Run Code Online (Sandbox Code Playgroud)
所有这些方法都假设Report
该类实际上是可复制的.
Jac*_*ack 11
我不知道我是否正确理解了您的问题,但是您不能在if/else块之前声明报告然后在其中初始化吗?
Report header;
if (...) {
header = Report();
else
header = Report(name,company);
Run Code Online (Sandbox Code Playgroud)
或者以较短的方式:
Report header; // calls default constructor
if (shouldInitializeWithParams) {
header = Report(name,company);
}
Run Code Online (Sandbox Code Playgroud)
当然,这需要您定义空构造函数.
我们不知道类是否Report
可复制,因此最好使用指针。
Report * header;
if (...) {
header = new Report();
else
header = new Report(name,company);
// after all don't forget
delete header;
Run Code Online (Sandbox Code Playgroud)
当然,您应该使用header
类似的指针
header->print_formatted();
Run Code Online (Sandbox Code Playgroud)
我想到的最简单的事情就是对代码流进行一些重构。创建一个处理输入并返回构造对象的函数:
Report loadReport() {
if (user_input()) {
// read input
return Report(name,company);
} else {
return Report();
}
}
Run Code Online (Sandbox Code Playgroud)
然后从 main 中调用该函数。设计中的一个小变化是引入了一个函数,该函数的唯一职责是Report
根据用户输入创建一个函数,这实际上作为一个函数是有意义的。