西北农林科技大学OJ (C++)智能指针操作媒体资源类(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<string>
#include<memory>
#include<vector>
using namespace std;
class MediaAsset
{
public:
    MediaAsset()
    {
        cout << "Constructor media asset" << endl;
    }
    virtual void Show() = 0;
    virtual ~MediaAsset()
    {
        cout << "Destructor media asset" << endl;
    }
};
class Song :virtual public MediaAsset
{
private:
    string artist;
    string title;
public:
    Song(string a, string b) :artist(a), title(b)
    {
        cout << "Constructor song" << endl;
    }
    void Show()
    {
        cout << artist << ", " << title << endl;
    }
    ~Song()
    {
        cout << "Destructor song" << endl;
    }
};
class Photo :virtual public MediaAsset
{
private:
    string date;
    string location;
    string subject;
public:
    Photo(string a, string b, string c) :date(a), location(b), subject(c)
    {
        cout << "Constructor photo" << endl;
    }
    void Show()
    {
        cout << date << ", " << location << ", " << subject << 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.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;
}

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值