Qt_IM_55 - 8BitsCoding/RobotMentor GitHub Wiki


// main.cpp
#include <QtCore/QCoreApplication>

#include <qmetaobject.h>
#include "car.h"
/*
	Factory method
	A framework needs to standardize the architectural model for a range of applications.
	but allow for indiviaul applications to define their own domain objects and provide for their instantiation.
*/

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	QMetaEnum metaEnum = QMetaEnum::fromType<car::Model>();

	for (int i = 0; i < metaEnum.keyCount(); i++) {
		QString key = metaEnum.key(i);
		qInfo() << "Attempting to create: " << key;
		car::Model model = static_cast<car::Model>(metaEnum.keyToValue(key.toLatin1()));
		car* c = car::make(model);
		c->drive();
		qInfo("");
	}

	return a.exec();
}
// car.h
#pragma once

#include <QObject>
#include <qmetaobject.h>
#include <qmetatype.h>
#include <qdebug.h>


class car : public QObject
{
	Q_OBJECT

public:
	enum Model{
		SLOWCAR,
		SPORTSCAR,
		RACECAR
	};
	Q_ENUM(Model)

	static car* make(Model model);
	virtual void drive() = 0;

	explicit car(QObject *parent = nullptr);
	~car();
};
// car.cpp
#include "car.h"

#include "race.h"
#include "slow.h"
#include "sports.h"

car::car(QObject *parent)
	: QObject(parent)
{
}

car::~car()
{
}

car* car::make(car::Model model)
{
	QMetaEnum metaEnum = QMetaEnum::fromType<car::Model>();
	qInfo() << "Creating: " << metaEnum.valueToKey(model);

	switch (model) {
	case car::Model::SLOWCAR:
		return new slow(nullptr);
	case car::Model::SPORTSCAR:
		return new sports(nullptr);
	case car::Model::RACECAR:
		return new race(nullptr);
	}

	return new slow(nullptr);
}

이미지

⚠️ **GitHub.com Fallback** ⚠️