2023吉林大学c++面向对象编程上机实验第三题

文章通过C++代码展示了如何设计摄像机和行车记录仪类,探讨了继承、组合和多态的概念。在不同场景下,行车记录仪类通过继承或组合摄像机类,实现了特定的功能。此外,还涉及了构造函数和析构函数的使用,以及如何通过抽象基类实现产品类层次结构的多态性。
摘要由CSDN通过智能技术生成

【注:解答全部为本人所写,仅供同学们学习时参考使用,请勿照搬抄袭!】

第三题:

我公司为仪器生产企业,目前生产摄像机和行车记录仪两种产品,分别销售给用户。

摄像机包含摄像、图像质量设定、编码算法等属性。

将摄像机增加相应芯片(具有操作菜单、自动拍摄、车速传感器、源代码等功能)后,形成一个行车记录仪。

要求:

设计摄像机类,并请根据下列不同的功能要求,采用不同的继承方式,设计行车记录仪类,并添加测试代码,体验不同继承方式下的成员访问属性。(类设计时可根据需要自行添加数据成员和其他成员函数。)

(1) 行车记录仪的芯片可以使用摄像机的摄像、图像质量设定功能。

   行车记录仪用户可以操作行车记录仪的操作菜单和摄像机的摄像功能。

(2)行车记录仪的芯片可以使用摄像机的拍摄、图像质量设定功能。

     行车记录仪用户仅仅可以操作行车记录仪的操作菜单。

(3) 行车记录仪的芯片可以使用摄像机的拍摄、图像质量设定功能。

     行车记录仪用户仅仅可以操作行车记录仪的操作菜单

     同时其他公司购买行车记录仪,因该公司也用于销售,不得泄露其全部内容

课后:

(1)采用组合方式设计行车记录仪类,增加相应测试代码,体验继承和组合的关系。

(2)分别为继承和组合方式下为各类添加构造函数、析构函数,增加相应测试代码,体验对象的初始化和构造顺序。

(3)将摄像机类和行车记录仪类功能相近的函数(如拍摄、编码等功能函数)设为同名函数,增加相应测试代码,体验同名函数覆盖。

(4)为我公司建立一个多态的产品类层次结构,使用抽象类,测试时,创建一个基类指针的容器,通过基类指针调用虚函数,体验多态。

3.1.1
#include <iostream>

class Camera {
public:
    void setVideoQuality(int quality) {
        // 设置视频质量
    }

    void setEncodingAlgorithm(std::string algorithm) {
        // 设置编码算法
    }

    void startRecording() {
        // 开始录像
    }

    void stopRecording() {
        // 停止录像
    }

    void captureImage() {
        // 拍照
    }

protected:
    // 摄像机的数据成员和其他成员函数
};

class CarRecorder : public Camera {
public:
    void setMenu() {
        // 设置行车记录仪的操作菜单
    }

    void autoCapture() {
        // 自动拍摄
    }

    void setSpeedSensor() {
        // 设置车速传感器
    }

    void captureCode() {
        // 拍摄源代码
    }

    // 可以访问 Camera 类的属性和方法
};

int main() {
    // 测试代码
    CarRecorder recorder;
    recorder.setVideoQuality(1080);
    recorder.setEncodingAlgorithm("H.264");
    recorder.startRecording();
    recorder.autoCapture();
    recorder.setSpeedSensor();
    recorder.captureCode();
    recorder.stopRecording();
    return 0;
}

3.1.2
#include <iostream>

class Camera {
public:
    void setVideoQuality(int quality) {
        // 设置视频质量
    }

    void setEncodingAlgorithm(std::string algorithm) {
        // 设置编码算法
    }

    void captureImage() {
        // 拍照
    }

protected:
    // 摄像机的数据成员和其他成员函数
};

class CarRecorder {
public:
    void setMenu() {
        // 设置行车记录仪的操作菜单
    }

    void autoCapture() {
        // 自动拍摄
    }

    void setSpeedSensor() {
        // 设置车速传感器
    }

    void captureCode() {
        // 拍摄源代码
    }

    // 可以访问 Camera 类的属性和方法
    void setVideoQuality(int quality) {
        camera.setVideoQuality(quality);
    }

    void setEncodingAlgorithm(std::string algorithm) {
        camera.setEncodingAlgorithm(algorithm);
    }

protected:
    Camera camera;
};

int main() {
    // 测试代码
    CarRecorder recorder;
    recorder.setMenu();
    recorder.setVideoQuality(720);
    recorder.setEncodingAlgorithm("H.264");
    recorder.autoCapture();
    recorder.setSpeedSensor();
    recorder.captureCode();
    return 0;
}


3.1.3
#include <iostream>

class Camera {
public:
    void setVideoQuality(int quality) {
        // 设置视频质量
    }

    void setEncodingAlgorithm(std::string algorithm) {
        // 设置编码算法
    }

    void captureImage() {
        // 拍照
    }

protected:
    // 摄像机的数据成员和其他成员函数
};

class CarRecorder : private Camera {
public:
    void setMenu() {
        // 设置行车记录仪的操作菜单
    }

    void autoCapture() {
        // 自动拍摄
    }

    void setSpeedSensor() {
        // 设置车速传感器
    }

    void captureCode() {
        // 拍摄源代码
    }

    std::string getMenu() {
        return "Menu"; // 返回行车记录仪的操作菜单
    }

    // 可以访问 Camera 类的属性和方法
    using Camera::setVideoQuality;
    using Camera::setEncodingAlgorithm;

private:
    // 为了保护摄像和图像质量设定功能,将 Camera 类的所有成员变成私有成员
    using Camera::captureImage;
};

int main() {
    // 测试代码
    CarRecorder recorder;
    recorder.setMenu();
    recorder.setVideoQuality(720);
    recorder.setEncodingAlgorithm("H.264");
    recorder.autoCapture();
    recorder.setSpeedSensor();
    recorder.captureCode();

    // 用户可以访问行车记录仪的操作菜单
    std::cout << recorder.getMenu() << std::endl;

    // 其他公司无法访问 Camera 类的摄像和图像质量设定功能
    // recorder.setVideoQuality(1080); // 编译错误
    // recorder.captureImage(); // 编译错误

    return 0;
}

3.2.1
#include "Camera.h"

class CarRecorder {
public:
    CarRecorder(int videoQuality) : camera_(videoQuality) {}

    void startRecording() {
        // start recording using camera
        camera_.startRecording();
    }

    void stopRecording() {
        // stop recording using camera
        camera_.stopRecording();
    }

    void showMenu() {
        // show recorder menu
        // ...
    }

private:
    Camera camera_;
};
int main() {
    CarRecorder recorder(720);
    recorder.startRecording();
    recorder.showMenu();
    recorder.stopRecording();
    return 0;
}


3.2.2.1
#include <iostream>

// 摄像机类
class Camera {
public:
    Camera() {
        std::cout << "Constructing Camera..." << std::endl;
    }

    ~Camera() {
        std::cout << "Destructing Camera..." << std::endl;
    }
};

// 行车记录仪类,继承自摄像机类
class DrivingRecorder : public Camera {
public:
    DrivingRecorder() {
        std::cout << "Constructing DrivingRecorder..." << std::endl;
    }

    ~DrivingRecorder() {
        std::cout << "Destructing DrivingRecorder..." << std::endl;
    }
};

int main() {
    std::cout << "Testing Inheritance" << std::endl;
    {
        DrivingRecorder dr;
    }

    return 0;
}
3.2.2.2
#include <iostream>

// 摄像机类
class Camera {
public:
    Camera() {
        std::cout << "Constructing Camera..." << std::endl;
    }

    ~Camera() {
        std::cout << "Destructing Camera..." << std::endl;
    }
};

// 行车记录仪类,使用组合方式包含摄像机类
class DrivingRecorder {
public:
    DrivingRecorder() : camera() {
        std::cout << "Constructing DrivingRecorder..." << std::endl;
    }

    ~DrivingRecorder() {
        std::cout << "Destructing DrivingRecorder..." << std::endl;
    }

private:
    Camera camera;
};

int main() {
    std::cout << "Testing Composition" << std::endl;
    {
        DrivingRecorder dr;
    }

    return 0;
}




3.2.3
#include <iostream>
using namespace std;

class Camera {
public:
    Camera() { cout << "Camera constructor" << endl; }
    ~Camera() { cout << "Camera destructor" << endl; }
    void shoot() { cout << "Shoot a video" << endl; }
    void encode() { cout << "Encode the video" << endl; }
};

class CarRecorder : public Camera {
public:
    CarRecorder() { cout << "CarRecorder constructor" << endl; }
    ~CarRecorder() { cout << "CarRecorder destructor" << endl; }
    void shoot() { cout << "Shoot a video and save it" << endl; }
    void encode() { cout << "Encode the video and add time stamp" << endl; }
    void showMenu() { cout << "Show the recorder menu" << endl; }
};

int main() {
    CarRecorder recorder;
    recorder.shoot();  // 调用CarRecorder类的shoot函数
    recorder.encode();  // 调用CarRecorder类的encode函数
    recorder.showMenu();  // 调用CarRecorder类的showMenu函数

    recorder.Camera::shoot();  // 调用Camera类的shoot函数
    recorder.Camera::encode();  // 调用Camera类的encode函数

    return 0;
}

3.2.4
// 抽象基类 Product
class Product {
public:
    virtual ~Product() {}
    virtual void printDescription() = 0; // 纯虚函数
};

// 摄像机类 Camera 继承自 Product
class Camera : public Product {
public:
    virtual void printDescription() override {
        std::cout << "This is a camera." << std::endl;
    }
    // 其他摄像机类相关的成员函数和数据成员
};

// 行车记录仪类 DashCam 继承自 Product
class DashCam : public Product {
public:
    virtual void printDescription() override {
        std::cout << "This is a dash cam." << std::endl;
    }
    // 其他行车记录仪类相关的成员函数和数据成员
};

// 生产线类 ProductionLine
class ProductionLine {
private:
    std::vector<Product*> products; // 产品的基类指针容器
public:
    ~ProductionLine() {
        for (auto p : products) {
            delete p;
        }
    }

    // 添加产品的方法,根据产品类型的不同,创建不同的子类实例并添加到容器中
    void addProduct(const std::string& type) {
        if (type == "camera") {
            products.push_back(new Camera());
        } else if (type == "dash cam") {
            products.push_back(new DashCam());
        } else {
            std::cout << "Invalid product type!" << std::endl;
        }
    }

    // 打印产品的描述信息
    void printProductDescriptions() {
        for (auto p : products) {
            p->printDescription(); // 调用虚函数,体验多态
        }
    }
};
int main() {
    ProductionLine pl;
    pl.addProduct("camera");
    pl.addProduct("dash cam");
    pl.addProduct("invalid product");

    pl.printProductDescriptions();

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值