西北农林科技大学2024学年C++面向对象程序设计OJ——T16 智能指针操作媒体资源类(C++新标准)

一.题目描述

Description

设计一个媒体资源类MediaAsset和它的派生类歌曲类Song、照片类Photo,要求:

(1)MediaAsset类中有构造函数、虚析构函数及纯虚函数void Show();

(2)歌曲类Song继承于MediaAsset类,新增string类型数据成员artist和title,并调用其构造函数实现初始化,覆盖基类Show函数并输出其新增数据成员;

(3)照片类Photo继承于MediaAsset类,新增string类型数据成员date、location和subject,并调用其构造函数实现初始化,覆盖基类Show函数并输出其新增数据成员。

在main函数中,分别通过shared_ptr和new两种方式构建不同派生类对象,然后依次调用所有对象的Show函数实现输出,最后输出Photo类所有对象的Show函数实现输出,比较两种动态分配方式处理对象的差异性。

main函数参考测试代码如下:

int main()
{
    string type;

    cin >> type;

    if (type=="shared_ptr")
    {
        vector<shared_ptr<MediaAsset>> assets
        {
            make_shared<Song>("Himesh Reshammiya", "Tera Surroor"),
            make_shared<Song>("Penaz Masani", "Tu Dil De De"),
            make_shared<Photo>("2011-04-06", "Redmond, WA", "Soccer field at a park."),
            make_shared<Song>("Bob Dylan", "The Times They Are A Changing"),
            make_shared<Song>("Aretha Franklin", "Bridge Over Troubled Water"),
            make_shared<Song>("Thala", "Entre El Mar y Una Estrella"),
            make_shared<Photo>("2021-12-06", "Xian, China", "Snowing at bell tower.")
        };

        vector<shared_ptr<MediaAsset>> photos;

        for (const auto& p : assets)
        {
            p->Show();
            shared_ptr<Photo> temp = dynamic_pointer_cast<Photo>(p);
            if (temp.get()!=nullptr)
            {
                photos.push_back(p);
            }
        }

        for (const auto&  p : photos)
        {
            p->Show();
        }
    }
    else if (type=="new")
    {
        vector<MediaAsset*> assets
        {
            new Song("Himesh Reshammiya", "Tera Surroor"),
            new Song("Penaz Masani", "Tu Dil De De"),
            new Photo("2011-04-06", "Redmond, WA", "Soccer field at a park."),
            new Song("Bob Dylan", "The Times They Are A Changing"),
            new Song("Aretha Franklin", "Bridge Over Troubled Water"),
            new Song("Thala", "Entre El Mar y Una Estrella"),
            new Photo("2021-12-06", "Xian, China", "Snowing at bell tower.")
        };

        vector<MediaAsset *> photos;

        for (const auto& p : assets)
        {
            p->Show();
            Photo *temp = dynamic_cast<Photo *>(p);
            if (temp!=nullptr)
            {
                photos.push_back(p);
            }
        }

        for (const auto&  p : photos)
        {
            p->Show();
        }
    }
    else
        cout << "Input error!" << endl;

    return 0;
}

二.输入与输出

Input

新建对象方式选择,或者选择shared_ptr,或者选择new

Output

构造函数输出信息

所有对象Show函数调用输出结果

Photo类对象Show函数调用输出结果

析构函数输出信息

Sample Input 1 

shared_ptr

Sample Output 1

Constructor media asset
Constructor song
Constructor media asset
Constructor song
Constructor media asset
Constructor photo
Constructor media asset
Constructor song
Constructor media asset
Constructor song
Constructor media asset
Constructor song
Constructor media asset
Constructor photo
Himesh Reshammiya, Tera Surroor
Penaz Masani, Tu Dil De De
2011-04-06, Redmond, WA, Soccer field at a park.
Bob Dylan, The Times They Are A Changing
Aretha Franklin, Bridge Over Troubled Water
Thala, Entre El Mar y Una Estrella
2021-12-06, Xian, China, Snowing at bell tower.
2011-04-06, Redmond, WA, Soccer field at a park.
2021-12-06, Xian, China, Snowing at bell tower.
Destructor song
Destructor media asset
Destructor song
Destructor media asset
Destructor photo
Destructor media asset
Destructor song
Destructor media asset
Destructor song
Destructor media asset
Destructor song
Destructor media asset
Destructor photo
Destructor media asset

Sample Input 2 

new

Sample Output 2

Constructor media asset
Constructor song
Constructor media asset
Constructor song
Constructor media asset
Constructor photo
Constructor media asset
Constructor song
Constructor media asset
Constructor song
Constructor media asset
Constructor song
Constructor media asset
Constructor photo
Himesh Reshammiya, Tera Surroor
Penaz Masani, Tu Dil De De
2011-04-06, Redmond, WA, Soccer field at a park.
Bob Dylan, The Times They Are A Changing
Aretha Franklin, Bridge Over Troubled Water
Thala, Entre El Mar y Una Estrella
2021-12-06, Xian, China, Snowing at bell tower.
2011-04-06, Redmond, WA, Soccer field at a park.
2021-12-06, Xian, China, Snowing at bell tower.

三.代码

#include <iostream>
#include <vector>
#include <memory>
#include <string>

using namespace std;

class MediaAsset {
public:
    MediaAsset() {
        cout << "Constructor media asset" << endl;
    }

    virtual void Show() const = 0;

    virtual ~MediaAsset() {
        cout << "Destructor media asset" << endl;
    }
};

class Song : public MediaAsset {
private:
    string artist;
    string title;

public:
    Song(const string& artist, const string& title) : artist(artist), title(title) {
        cout << "Constructor song" << endl;
    }

    void Show() const override {
        cout << artist << ", " << title << endl;
    }

    ~Song() {
        cout << "Destructor song" << endl;
    }
};

class Photo : public MediaAsset {
private:
    string date;
    string location;
    string description;

public:
    Photo(const string& date, const string& location, const string& description)
            : date(date), location(location), description(description) {
        cout << "Constructor photo" << endl;
    }

    void Show() const override {
        cout << date << ", " << location << ", " << description << endl;
    }

    ~Photo() {
        cout << "Destructor photo" << endl;
    }
};

int main() {
    string type;
    cin >> type;

    if (type == "shared_ptr") {
        vector<shared_ptr<MediaAsset>> assets {
            make_shared<Song>("Himesh Reshammiya", "Tera Surroor"),
            make_shared<Song>("Penaz Masani", "Tu Dil De De"),
            make_shared<Photo>("2011-04-06", "Redmond, WA", "Soccer field at a park."),
            make_shared<Song>("Bob Dylan", "The Times They Are A Changing"),
            make_shared<Song>("Aretha Franklin", "Bridge Over Troubled Water"),
            make_shared<Song>("Thala", "Entre El Mar y Una Estrella"),
            make_shared<Photo>("2021-12-06", "Xian, China", "Snowing at bell tower.")
        };

        vector<shared_ptr<MediaAsset>> photos;

        for (const auto& p : assets) {
            p->Show();
            shared_ptr<Photo> temp = dynamic_pointer_cast<Photo>(p);
            if (temp != nullptr) {
                photos.push_back(p);
            }
        }

        for (const auto& p : photos) {
            p->Show();
        }
    } else if (type == "new") {
        vector<MediaAsset*> assets {
            new Song("Himesh Reshammiya", "Tera Surroor"),
            new Song("Penaz Masani", "Tu Dil De De"),
            new Photo("2011-04-06", "Redmond, WA", "Soccer field at a park."),
            new Song("Bob Dylan", "The Times They Are A Changing"),
            new Song("Aretha Franklin", "Bridge Over Troubled Water"),
            new Song("Thala", "Entre El Mar y Una Estrella"),
            new Photo("2021-12-06", "Xian, China", "Snowing at bell tower.")
        };

        vector<MediaAsset*> photos;

        for (const auto& p : assets) {
            p->Show();
            Photo* temp = dynamic_cast<Photo*>(p);
            if (temp != nullptr) {
                photos.push_back(p);
            }
        }

        for (const auto& p : photos) {
            p->Show();
        }
    } else {
        cout << "Input error!" << endl;
    }

    return 0;
}

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失忆已成习惯.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值