【问题标题】:What needs to be in the constructor and what needs to be in the setter functions?构造函数中需要什么,setter 函数中需要什么?
【发布时间】:2020-03-10 21:15:29
【问题描述】:

目标是输出与第一个程序相同的数据。 第一个程序需要手动输入房间号和房间费用。第二个(有问题的)程序要求它自动填充房间号和房间成本,这些房间号和房间成本被硬编码到主数组中。 需要一个“房间”类的默认构造函数来填充数组并添加 setter 函数来设置房间号和成本的值。 整个程序的目标是创建数组,填充测试数据,然后列出房间的数据。 程序 1(手动输入) - 这很好用;

#include<iostream>
using namespace std;

class room 
{
    int roomNo;
    float roomCost;
public:    
    void GetData ();        
    void PutData ();        
};
void room::GetData ()   
{
    cout << "\n\tEnter room number : ";
    cin >> roomNo;
    cout << "\n\tEnter room cost : ";
    cin >> roomCost;
} 
void room::PutData ()       
{
    cout << "\n\t\t\t" << roomNo << " \t|\t " << roomCost;
} 

int main () 
{
    int roomNo;

    room roomList[10];  

    for (roomNo = 0; roomNo < 10; roomNo++)
    {
        cout << "\nEnter details of " << roomNo + 1 << " room" << endl;
        roomList[roomNo].GetData ();
    }
    cout <<"\n*******************************************************************************";
    cout << "\n\t\t\t   Room Details";
    cout <<"\n*******************************************************************************";
    cout << "\n\t\t Room Number \t|     Cost per Night";
    cout << "\n\t\t--------------------------------------";
        for (roomNo = 0; roomNo < 2; roomNo++)
        roomList[roomNo].PutData();     

    getchar ();
    getchar ();
}

第二个(有问题的)程序;

#include<iostream>
using namespace std;

class room 
{
    int roomNo;
    float roomCost;
public:
    room();
    void PutData ();        
};
room::room()
{
    cout<<"\n\t\t\t"<<roomNo<<" \t|\t "<<roomCost;
}
void room::PutData ()       
{
    cout << "\n\t\t\t" << roomNo << " \t|\t " << roomCost;
} 

int main () 
{
    int roomNo[10] = {1,2,3,4,5,6,7,8,9,10};
    float roomCost[10] = {100.00, 90.00, 85.50, 80.00, 80.00, 50.00, 50.00, 45.50, 45.50, 40.00};

    room roomList[10];  //Statement 3 : Creating Array of 3 Employees

    cout <<"\n*******************************************************************************";
    cout << "\n\t\t\t   Room Details";
    cout <<"\n*******************************************************************************";
    cout << "\n\t\t Room Number \t|     Cost per Night";
    cout << "\n\t\t--------------------------------------";

    for (int roomNo = 0; roomNo < 10; roomNo++)
    roomList[roomNo].PutData();

    getchar ();
    getchar ();
}

【问题讨论】:

  • 构造函数应该将对象初始化为有效状态,仅此而已。它不应该做输出或输入。第二个示例中的构造函数不进行任何初始化,它只是打印 uninitialized 成员及其 indeterminate 值,这会导致 未定义行为
  • 仅供参考:int roomNo[10] 没有理由存在于第二个示例中。无论如何它都被循环变量隐藏了。

标签: c++ arrays constructor


【解决方案1】:

问题是roomNoroomCost 从未真正为每个room 实例设置任何值。该类不会自动从您在main 中定义的数组中提取。

另外,

roomList[roomNo].PutData();

访问未初始化的数据:

void room::PutData ()       
{
    cout << "\n\t\t\t" << roomNo << " \t|\t " << roomCost;
} 

(构造函数也有同样的问题)

解决方案是初始化每个room 使用正确的数据。我推荐使用构造函数:

room(int _roomNum, float _roomCost) : roomNo(_roomNum), roomCost(_roomCost)
{}

然后使用vector 进行初始化(而不是room roomsList[10]

std::vector<room> rooms;
rooms.reserve(10);
for(size_t i = 0; i < 10; ++i)
   rooms.emplace_back(roomNo[i], roomCost[i]);

Live Demo

【讨论】:

  • 非常感谢您的回答,这是我第一次使用矢量,blimey 确实省去了一些麻烦。也感谢您的现场演示,非常感谢。
  • @rodders:不客气。仅供参考,作为提问者,您可以“投票”将答案标记为已接受。目前,答案仅被标记为已接受。 (如果这是您的意图,请忽略)
【解决方案2】:

您应该有两个 setter,每个成员一个,然后像这样编写循环

for (int n = 0; n < 10; n++)
{
    roomList[n].setNumber(roomNo[n]);
    roomList[n].setCost(roomCost[n]);
}

(顺便说一句,您应该对第一个程序执行相同的操作,并在main 中处理用户输入。)

【讨论】:

  • 非常感谢您的回答。我现在已经对此进行了讨论,这更有意义。
猜你喜欢
  • 1970-01-01
  • 2018-06-02
  • 2021-08-12
  • 2021-06-17
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 2011-02-25
相关资源
最近更新 更多