在条件c ++语句中创建对象

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)

当然,这需要您定义空构造函数.


Tim*_*hko 5

我们不知道类是否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` 是否可复制,所以最好使用一个单独的函数,它只需要 `Report` 是可移动的。如果你仍然推荐指针使用 `std::unique_ptr` 而不是原始指针。 (2认同)

Dav*_*eas 5

我想到的最简单的事情就是对代码流进行一些重构。创建一个处理输入并返回构造对象的函数:

Report loadReport() {
    if (user_input()) {
        // read input
        return Report(name,company);
    } else {
        return Report();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后从 main 中调用该函数。设计中的一个小变化是引入了一个函数,该函数的唯一职责是Report根据用户输入创建一个函数,这实际上作为一个函数是有意义的。