if (name == "BMW") 比較指標位址,非內容。需用 strcmp 或 std::string。cout << "type is" << getcar() << endl; 缺少物件指標,應為 cc->getcar()。virtual char* getcar(),衍生類實作一致,但主程式呼叫錯誤。#include
#include // strcmp
using namespace std;
class Car {
public:
virtual const char* getName() const = 0; // 純虛函式
virtual ~Car() {} // 虛解構函式
};
class BMW : public Car {
public:
const char* getName() const override { return "BMW"; }
};
class Benz : public Car {
public:
const char* getName() const override { return "BENZ"; }
};
class CarFactory {
public:
static Car* createCar(const char* name) {
if (strcmp(name, "BMW") == 0) return new BMW();
if (strcmp(name, "BENZ") == 0) return new Benz();
return nullptr;
}
};
int main() {
char name[20] = {0};
cout << "Input car type (BMW/BENZ): ";
cin >> name;
Car* car = CarFactory::createCar(name);
if (car) {
cout << "Type is " << car->getName() << endl;
delete car; // 釋放記憶體
} else {
cout << "Unknown car type" << endl;
}
return 0;
}
| 問題 | 修正 |
|---|---|
| char* 比較用 == | strcmp(name, "BMW") == 0 |
| 虛函式呼叫無物件 | car->getName() |
| 記憶體洩漏 | delete car |
| 建議改用 std::string | 避免手動記憶體、比較直觀 |
#include
#include
#include
#include
class Car {
public:
virtual std::string getName() const = 0;
virtual ~Car() = default;
};
class CarFactory {
std::unordered_map()>> registry;
public:
template
void registerCar(const std::string& name) {
registry[name] = []{ return std::make_unique(); };
}
std::unique_ptr create(const std::string& name) {
auto it = registry.find(name);
return it != registry.end() ? it->second() : nullptr;
}
};
// 使用
int main() {
CarFactory factory;
factory.registerCar("BMW");
factory.registerCar("BENZ");
std::string name;
std::cin >> name;
if (auto car = factory.create(name)) {
std::cout << "Type is " << car->getName() << '\n';
}
}
修正字串比較、虛函式呼叫、記憶體管理,並展示現代 C++ 工廠模式寫法。