首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 簡單工廠模式:字串比較錯誤與虛函式呼叫修正

     編輯:程式設計綜合問答

原始碼問題

  1. 字串比較用 ==:if (name == "BMW") 比較指標位址,非內容。需用 strcmp 或 std::string。
  2. 虛函式呼叫語法錯誤:cout << "type is" << getcar() << endl; 缺少物件指標,應為 cc->getcar()。
  3. 回傳型別不一致:基類宣告 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避免手動記憶體、比較直觀

現代化改良 (C++11/14/17)


#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++ 工廠模式寫法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved