samedi 10 décembre 2022

Segmentation fault using unique ptr

I am trying to implement a simple Abstract Factory Design Pattern using unique pointers in C++. I am following this link as reference (but modified a bit). The link uses raw pointers and I want to use unique ptrs instead. Please find the code below. Problem: Segmentation fault. I can't point my finger where this fault is arising from.

devices.hpp:

#ifndef PHONE_HPP
#define PHONE_HPP

#include <iostream>
#include <string>

class phone
{
    public:
        virtual std::string get_name() const = 0;
};

class iphone : public phone
{
    public:
        std::string get_name() const override;
};

class android : public phone
{
    public:
        std::string get_name() const override;
};

class laptop
{
    public:
        virtual std::string get_name() const = 0;
};

class mac : public laptop
{
    public:
        std::string get_name() const override;
};

class chromebook : public laptop
{
    public:
        std::string get_name() const override;
};

devices.cpp

#include <iostream>
#include <string>
#include "phone.hpp"

std::string iphone::get_name() const {
    return "iPhone X";
}

std::string android::get_name() const {
    return "Pixel 6";
}

std::string mac::get_name() const {
    return "Macbook Air";
}

std::string chromebook::get_name() const {
    return "Chrome Flex";
}

device_manufacturer.hpp file:


#ifndef DEVICE_MANUFACTURER_HPP
#define DEVICE_MANUFACTURER_HPP

#include <iostream>
#include <string>
#include <memory>
#include "phone.hpp"

class device_manufacturer
{
    public:
        enum Manufacturer{APPLE, GOOGLE};

        virtual std::unique_ptr<phone> get_phone() const = 0;
        virtual std::unique_ptr<laptop> get_laptop() const = 0;

        static std::unique_ptr<device_manufacturer> create_device(const Manufacturer& manf_input);
};

class Apple : public device_manufacturer
{
public:
    std::unique_ptr<phone> get_phone() const override;
    std::unique_ptr<laptop> get_laptop() const override;
};

class Google : public device_manufacturer
{
public:
    std::unique_ptr<phone> get_phone() const override;
    std::unique_ptr<laptop> get_laptop() const override;
};

device_manufacturer.cpp:

#include <iostream>
#include <string>
#include <memory>
#include "device_manufacturer.hpp"
#include "phone.hpp"

std::unique_ptr<device_manufacturer> device_manufacturer::create_device(const Manufacturer& manf_input){
    std::unique_ptr<device_manufacturer> manf_ptr;
    if (manf_input == Manufacturer::APPLE)
    {
        manf_ptr = std::make_unique<Apple>();
    }
    if (manf_input == Manufacturer::GOOGLE)
    {
        manf_ptr = std::make_unique<Google>();
    }
    return manf_ptr;
    
}

std::unique_ptr<phone> Apple::get_phone() const {
    return std::unique_ptr<iphone>();
}

std::unique_ptr<phone> Google::get_phone() const {
    return std::unique_ptr<android>();
}

std::unique_ptr<laptop> Apple::get_laptop() const {
    return std::unique_ptr<mac>();
}

std::unique_ptr<laptop> Google::get_laptop() const {
    return std::unique_ptr<chromebook>();
}

And finally the client code:

main.cpp:

#include <iostream>
#include <string>
#include <memory>
#include "device_manufacturer.hpp"
#include "phone.hpp"

int main(){
    std::unique_ptr<device_manufacturer> manf = device_manufacturer::create_device(device_manufacturer::Manufacturer::APPLE);
    std::cout << manf->get_laptop()->get_name() << std::endl;


    return 0;
}

Aucun commentaire:

Enregistrer un commentaire