逆影之锋 2022-10-21 22:20 采纳率: 100%
浏览 27
已结题

对于无法输出string类变量的值的疑问

设计一个图书管理程序,能进行添加,删除,查询操作,有date类,author类和book类,要求使用类和对象的知识,最好不用继承,然后我就用了子对象来解决。
前面设计类问题都不大,到了设计图书管理程序时直接给我整不会了

全部代码如下

#include <iostream>
using namespace std;
class date
{
protected:
    int year;//年
    int month;//月
    int day;//日
public:
    date() {};
    date(int y, int m, int d)//构造函数
    {
        year = y;
        month = m;
        day = d;
    }
    void showdate()
    {
        cout << year<< "年" <<  month<<"月" << day << "日";
    }
};
class author
{
protected:
    string name;//姓名
    int  age;//年龄
    date wridate;//写作时间为子对象
public:
    author() {};
    author(int y, int m, int d, string nam, int ag) ://构造函数
         wridate(y, m, d)
    {
        name = nam;
        age = ag;
    }
    void showwrdate()//输出写作时间子对象
    {
        cout << "图书写作时间:"  ;
        wridate.showdate();
    }
    void showau()//输出作者信息
    {
        cout << "作者姓名:" << name <<endl << "年龄:" << age ;
    }
};
class book
{
    protected:
    int num;//书号
    string bookname;//书名
    float price;//价格
    string press;//出版社
    date pubdate;//出版时间为子对象
    author writer;//作者为子对象
    public:
        book() {};
        book(int a,int b,int c,int y, int m, int d,int n,string bna,float pri,string pre,string nam,int ag ) :
            pubdate(a,b,c),writer(y,m,d,nam,ag)
        {
            num = n;
            bookname = bna;
            price = pri;
            press = pre;
        }
        void showbook()//输出图书信息
        {
            cout << "书号: " << num << endl << "书名: " << bookname << endl<< "价格:" << price << endl << "出版社:" << press << endl;
            cout << "图书出版时间:"; pubdate.showdate(); cout << endl;
            writer.showwrdate(); cout << endl;
            writer.showau(); cout << endl;
        }
        
};
void showMenu()
{
    cout << "图书管理程序" << endl;
    cout << "1.添加图书 " << endl;
    cout << "2.删除图书 " << endl;
    cout << "3.查询图书 " << endl;
    cout << "4.全部显示 " << endl;
}
int main()
{
    /*book b1(2002, 1, 1, 2000, 1, 1, 01, "c++", 80, "清华大学出版社", "小明", 70);
    b1.showbook();*/
    while (true)
    {
        book sumbo[1];
        showMenu();
        int se = 0;
        cin >> se;
        switch (se)
        {
        case 1:
         {
            cout << "请依次输入图书出版时间,写作时间,书号,书名,价格,出版社,作者姓名,年龄" << endl;
            
                int a; int b; int c; int y; int m; int d; int n; string bna; float pri; string pre; string nam; int ag;
                cin >> a >> b >> c >> y >> m >> d >> n >> bna >> pri >> pre >> nam >> ag;
                sumbo[0] = { book(a,b,c,y,m,d,n,bna,pri,pre,nam,ag) };
            
            system("pause");
            system("cls");
            break;
          }
        case 2:

            break;
        case 3:
            break;
        case 4:
            sumbo[0].showbook();
            break;
        default:break;
        }
    }
    system("pause");
    return 0;

}

在不运行while(true)这一行以及往下的代码时,运行注释的代码可以得到
书号: 1
书名: c++
价格:80
出版社:清华大学出版社
图书出版时间:2002年1月1日
图书写作时间:2000年1月1日
作者姓名:小明
年龄:70
也就是下图

img

但是如果运行Switch里面的代码
先选case1

img


再选case4

img


这里三个string类的变量都没有输出

img


已经理解不能了,希望能指点一下是哪个地方出了问题。另外如果不使用对象数组的话,应该要怎么做

  • 写回答

2条回答 默认 最新

  • 浪客 2022-10-21 23:11
    关注
    #include <vector>
    
    int main()
    {
        /*book b1(2002, 1, 1, 2000, 1, 1, 01, "c++", 80, "清华大学出版社", "小明", 70);
        b1.showbook();*/
        vector<book> sumbo;//
        while (true)
        {
            // book sumbo;
            showMenu();
            int se = 0;
            cin >> se;
            switch (se)
            {
            case 1:
            {
                cout << "请依次输入图书出版时间,写作时间,书号,书名,价格,出版社,作者姓名,年龄" << endl;
    
                int a;
                int b;
                int c;
                int y;
                int m;
                int d;
                int n;
                string bna;
                float pri;
                string pre;
                string nam;
                int ag;
                cin >> a >> b >> c >> y >> m >> d >> n >> bna >> pri >> pre >> nam >> ag;
                sumbo.push_back(book(a, b, c, y, m, d, n, bna, pri, pre, nam, ag));//
    
                system("pause");
                system("cls");
                break;
            }
            case 2:
    
                break;
            case 3:
                break;
            case 4:
            //
                for (vector<book>::iterator it = sumbo.begin(); it != sumbo.end(); it++)
                    it->showbook();
                break;
    
            default:
                break;
            }
        }
        system("pause");
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月31日
  • 已采纳回答 10月23日
  • 修改了问题 10月21日
  • 创建了问题 10月21日

悬赏问题

  • ¥15 爬取1-112页所有帖子的标题但是12页后要登录后才能 我使用selenium模拟登录 账号密码输入后 会报错 不知道怎么弄了
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型
  • ¥15 安装Paddleocr时报错无法解决
  • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点