Я пытаюсь реализовать простой шаблон проектирования абстрактной фабрики, используя уникальные указатели на С++. Я следую этой ссылке в качестве ссылки (но немного измененной). В ссылке используются необработанные указатели, и вместо этого я хочу использовать уникальные указатели. Пожалуйста, найдите код ниже. Проблема: Ошибка сегментации. Я не могу указать пальцем, откуда возникает эта ошибка.
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>();
}
И, наконец, клиентский код:
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;
}
Говорит ли ваш учебник/профессор/что-то еще о необходимости виртуальных деструкторов? Потому что виртуальные деструкторы необходимы, а "туториал", который забывает учитывать этот базовый факт, - чистый мусор.
@н.м. спасибо, я забыл добавить виртуальный деструктор = строка по умолчанию





return std::unique_ptr<mac>() (и другие) не выделяет память; он просто говорит, что у вас есть unique_ptr, который указывает на mac; но на самом деле он инициализирован nullptr.
Вместо этого измените на return std::make_unique<mac>(); (и то же самое для других 3 функций)
В какой строке кода возникает ошибка сегментации?