before.cxx
#include <iostream>
#include <string>
class Apple {
public:
void sayHello(void) {
std::cout << "Hello, I'm a apple." << std::endl;
}
};
class Banana {
public:
void sayHello(void) {
std::cout << "Hello, I'm a banana." << std::endl;
}
};
class Pear {
public:
void sayHello(void) {
std::cout << "Hello, I'm a pear." << std::endl;
}
};
int main(void) {
Apple apple;
apple.sayHello();
// Banana banana;
// banana.sayHello();
// Pear pear;
// pear.sayHello();
return 0;
}
#include <iostream>
#include <string>
#include "config.hxx"
class Fruit {
public:
virtual void sayHello(void) = 0;
};
class Apple: public Fruit {
void sayHello(void) {
std::cout << "Hello, I'm a apple." << std::endl;
}
};
class Banana: public Fruit {
public:
void sayHello(void) {
std::cout << "Hello, I'm a banana." << std::endl;
}
};
class Pear: public Fruit {
public:
void sayHello(void) {
std::cout << "Hello, I'm a pear." << std::endl;
}
};
class FruitFactory {
public:
Fruit *createFruit(const std::string &fruitName) {
Fruit *fruit;
if (!fruitName.compare("Apple")) {
fruit = new Apple();
} else if (!fruitName.compare("Banana")) {
fruit = new Banana();
} else if (!fruitName.compare("Pear")) {
fruit = new Pear();
} else {
throw std::invalid_argument("invalid fruit name: " + fruitName);
}
return fruit;
}
};
int main(void) {
try {
FruitFactory fruitFactory;
Fruit *fruit = fruitFactory.createFruit(_FRUIT_NAME_);
fruit->sayHello();
delete fruit;
} catch(const std::exception &e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
config.hxx
#define _FRUIT_NAME_ "Apple"
// #define _FRUIT_NAME_ "Banana"
// #define _FRUIT_NAME_ "Pear"