C++ 继承 vector 问题(无限循环+在其他类中使用 vector 的问题)

标签 c++ vector

我正在制作一个表面,让用户输入信息并打印出来。

这就是它的样子。

main <- menu <- Reservation
             <- BookingManager <- BookingRecord

我创建了一个 vector vector<string> CompanyName在预订中,
这是outputdataInfo()添加公司名称,
void Reservation::outputdataInfo()
{
    string CompName;
    cout << "Company Name <-" << endl;
    cin >> CompName;
    Reservation::setCompanyName(string (CompName) );
    cout << CompanyName.at(0) << endl;
    // Use for test and it works
    cout << CompanyName.size() << endl;
    // Use for test and it works
    cout << "End of Reservation, thank you." << endl;
}

CompanyName 的设置者:(工作)
void Reservation::setCompanyName(const string& cn)
{this->CompanyName.push_back(cn);}

但是现在BookingRecord::outputdataInfo()想打印预订记录。
void BookingRecord::outputdataInfo()
{
    cout << "      ----- Booking Record -----" << endl;
    Reservation::printBookingRecord();
}

我这样写(不确定这是否正确):
void Reservation::printBookingRecord() {
    for (int i = 0; i < CompanyName.size(); i++) {
        cout << " ---- Company ---- " << endl;
        cout << "Name: " << CompanyName.at(i) << endl;
    }
}

但是 CompanyName 突然看起来好像什么都忘记了,或者像重置了大小。
结果是BookingRecord::outputdataInfo()无限不停地打印,但 Reservation::printBookingRecord() 没有任何 react .这很奇怪,因为假设 BookingRecord::outputdataInfo() 中没有 for 循环.
我想知道如何打印数据( Reservation::printBookingRecord()BookingRecord::outputdataInfo() 调用,但 vector 位于“保留”处)
(或者 vector 可以在其他类中使用)
非常感谢 :)

源代码 (有点长)
//
//  main.cpp
//
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include "Menu.h"
#include "Reservation.h"
#include "BookingManager.h"
using namespace std;
int main(int argc, const char* argv[]) {
    Menu m;
    Reservation R;
    BookingManager BM;
    char choice;
    do {
        choice = m.menu();
        switch (choice)
        {
        case 'R': case 'r':
            R.outputdataInfo();
            break;
        case 'B': case 'b':
            BM.outputdataInfo();
            break;
        default:
            cout << "Invalid Alphabet. Please try again." << endl;
            break;
        }
    } while (choice == 'R' || choice == 'r' || choice == 'B' || choice == 'b');
    return 0;
}
//.....................
//  Menu.h
//
#include <iostream>
#ifndef Menu_h  
#define Menu_h  
class Menu {
public:   //Accessibility as public
    char option;
    char menu();
};
#endif
//.....................
//  Menu.cpp
//
#include <iostream>
#include "Menu.h"
using namespace std;
char Menu::menu() {
    cout << "" << endl;
    cout << "        BNC Exhibition Tour in European Cities" << endl;
    cout << "               Exhibition Recruitment         " << endl;
    cout << "                                              " << endl;
    cout << "Please type:" << endl;
    cout << "R -> for Reservation Page" << endl;
    cout << "B -> for Booking Manager Page" << endl;
    cout << "And Press ENTER." << endl;
    cin >> option;
    cout << "" << endl;
    return option;
}
//.............................
//  Reservation.h
//
#include <iostream>
#include <vector>
using namespace std;
#ifndef Reservation_h  
#define Reservation_h  
class Reservation {
private:
    vector<string> CompanyName;
public:   //Accessibility as public
    void outputdataInfo();
    void setCompanyName(const string& cn);
    Reservation();
    ~Reservation();
    void printBookingRecord();
};
#endif
//.....................................
//  Reservation.cpp
//
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <vector>
using namespace std;
#include "Reservation.h"
void Reservation::outputdataInfo()
{
    cout << "Please input detail information first :" << endl;
    string CompName;
    cout << "Company Name <-" << endl;
    cin >> CompName;
    Reservation::setCompanyName(string (CompName) );
    cout << CompanyName.at(0) << endl; //it works
    cout << CompanyName.size() << endl; //it works
    cout << "End of Reservation, thank you." << endl;
}
//////////////////////// S E T T E R ////////////////////
void Reservation::setCompanyName(const string& cn)
{
    this->CompanyName.push_back(cn);
}
//////////////////////// S E T T E R ////////////////////
Reservation::Reservation() {}
Reservation::~Reservation() {}
/////////////////////// P R I N T ///////////////////////
void Reservation::printBookingRecord() {
    for (int i = 0; i < CompanyName.size(); i++) {
        cout << " ---- Company ---- " << endl;
        cout << "Name: " << CompanyName.at(i) << endl;
    }
}
//.............................
//  BookingManager.h
//
#include <iostream>
#include <vector>
#ifndef BookingManager_h  
#define BookingManager_h  
class BookingManager {
public:   //Accessibility as public
    char option;
    void outputdataInfo();
};
//..........................................
//  BookingManager.cpp
//
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <vector>
#include "BookingManager.h"
#include "BookingRecord.h"
using namespace std;
void BookingManager::outputdataInfo() {
    BookingRecord BR;
    cout << "" << endl;
    cout << "      ----- Booking Manager -----" << endl;
    cout << "" << endl;
    cout << "Please type:" << endl;
    cout << "B -> for Booking Record" << endl;
    cout << "And Press ENTER." << endl;
    cin >> option;
    cout << "" << endl;
    do {
        switch (option)
        {
        case 'B': case 'b':
            BR.outputdataInfo();
            break;
        default:
            cout << "Invalid Alphabet. Please try again." << endl;
            break;
        }
    } while (option == 'B' || option == 'b');
}
#endif
//...........................................
//  BookingRecord.h
//
#include <iostream>
#include <vector>
#include "Reservation.h"
#ifndef BookingRecord_h  
#define BookingRecord_h  
class BookingRecord : public Reservation {
public:   //Accessibility as public
    void outputdataInfo();
};
#endif
//..........................................
//  BookingRecord.cpp
//
#include <iostream>
#include <string>
#include <vector>
#include "Reservation.h"
#include "BookingRecord.h"
void BookingRecord::outputdataInfo()
{
    cout << "" << endl;
    cout << "      ----- Booking Record -----" << endl;
    cout << "" << endl;
    cout << "     Print all the information..." << endl;
    Reservation::printBookingRecord();
}
// END

最佳答案

所以你有两个 CompanyNames在你的代码中。

一个在这里,R 的一部分多变的。

int main(int argc, const char* argv[]) {
    Menu m;
    Reservation R; 

另一个在这里
void BookingManager::outputdataInfo() {
    BookingRecord BR;
BookingRecord源自 Reservation , 所以它还包含一个 CompanyName .

我认为很明显,您正在向 CompanyName 添加名称在 Rmain但打印出 CompanyNameBRBookingManager::outputdataInfo .

类设计在我看来是错误的。例如,您的方法缺少参数。当然 BookingManager::outputdataInfo应该采取BookingRecord作为参数允许调用者指定哪个BookingRecord他们想输出。只需声明 BookingRecord作为 BookingManager::outputdataInfo 中的局部变量没有任何意义。

在您急于编写大量代码之前,请尝试考虑您的类的设计。不同的类应该如何相互关联,需要哪些成员变量,需要哪些方法,这些方法需要哪些参数和返回类型。考虑你的类如何模拟现实世界,而不是你将如何实现功能。稍后,请先正确设计。

关于C++ 继承 vector 问题(无限循环+在其他类中使用 vector 的问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61858122/

相关文章:

c++ - 加速 C++ 练习 11-6

c++ - 哪里可以下载适用于 Windows XP 的 Visual C++

c++ - 调试断言失败 - vector 迭代器不可取消引用

c++ - 在 C++ 中将对象 vector 保存到文件

c++ - 如何在 opengl 和 c++ 中围绕 "camera"旋转

c++ - 链表作业数组 - 运行时错误

c++ - MS Visual Studio 2017 上的 Variadic 模板编译问题

java - 如何将 vector 元素转换为逗号分隔的字符串

c++ - 逆运动学 ACos 误差 QNAN、INAN

r - dplyr:迭代计算