CPP的代码如下
Operation* OperationFactory:: CreateOperation(char opr) {
OperationAdd resultAdd;
OperationSub resultSub;
OperationMul resultMul;
OperationDiv resultDiv;
switch (opr) {
case '+':
return &resultAdd;
case '-':
return &resultSub;
case '*':
return &resultMul;
case '/':
return &resultDiv;
default:
break;
}}
我发现,当我试图改变这个工厂创建的对象的字段时,会出现一些错误。
一旦函数返回,你返回的指针就没有用了。在更简单的代码中也存在类似的问题。
int* dont_do_this(){
int x = 0;
return &x;
}
x
一旦函数返回,你的指针就不复存在了。Dereferencing它导致未定义的行为。
可以通过以下方法来解决这个问题 x
static
:
int* maybe_do_this() {
static int x = 0;
return &x;
}
现在 x
在函数调用之间持续存在。然而,即使你解决了这个问题,你的 "工厂 "也会一直返回指向相同对象的指针。如果这就是你想要的,你就不会真的需要一个工厂。一个工厂应该创建实例并返回它们。
std::unique_ptr<Operation> OperationFactory:: CreateOperation(char opr) {
switch (opr) {
case '+':
return std::make_unique<OperationAdd>();
case '-':
return std::make_unique<OperationSub>();
// ...
default:
return std::make_unique<OperationDefault>();
}
}
同时你需要注意在所有分支上返回一些东西 你应该使用智能指针而不是原始指针。
你好,欢迎来到StackOverflow!
你应该返回一个堆分配对象的指针,因为如果你在函数的作用域中返回一个堆分配对象的指针,该指针所指向的对象将被销毁,使用该指针将导致访问违规!
希望对你有所帮助!
我建议使用 std::unique_ptr<>
或自定义类型,管理对象的销毁,因为如果客户端不释放该内存,你可能会造成内存泄漏!