当我偶然发现这个时,我正在浏览我老师的代码:
Order* order1 = NULL;
然后
order1 = order(customer1, product2);
哪个叫
Order* order(Customer* customer, Product* product)
{
return new Order(customer, product);
}
Run Code Online (Sandbox Code Playgroud)
这看起来像愚蠢的代码.我不知道为什么,但老师将所有指针初始化为NULL而不是立即声明它们(看完代码它完全可能,但他选择不这样做).
我的问题是:这是好的还是可接受的代码?函数调用是否比明确调用构造函数有任何好处?在这种情况下,新工作如何?我能想象代码现在有点像:
order1 = new Order(customer, product);
初始化为NULL
[编辑]因为有一个有效的讨论,我已经改变了选项的顺序,以强调推荐的选项.
变量应声明为本地和尽可能晚,并立即初始化.因此,最常见的模式是:
Order * order1 = order(...);
Run Code Online (Sandbox Code Playgroud)
就在此之前order1.
如果有任何理由将声明order1与实例化分开,如下所示:
Order * order1; // Oh no! not initialized!
// ... some code
order1 = order(...);
Run Code Online (Sandbox Code Playgroud)
order1应该初始化为NULL,以防止未初始化的变量发生的常见错误,很容易引入// some code changes.
工厂方法
同样,这里还有一些更改的静态:实例化的要求Order可能会发生变化.我可以想到两种情况:
(1)Order的构造函数无法完成的验证.Order可能来自第三方库并且无法更改,或者实例化需要添加不在以下范围内的验证Order:
Order* order(Customer* customer, Product* product)
{
// Order can't validate these, since it doesn't "know" the database
database.ValidateCustomer(customer); // throws on error
database.ValidateProduct(product); // throws on error
return new Order(customer, product);
}
Run Code Online (Sandbox Code Playgroud)
(2)您可能需要一个行为不同的订单.
class DemoOrder : public Order { ... }
Order* order(Customer* customer, Product* product)
{
if (demoMode)
return new DemoOrder(customer, product); // doesn't write to web service
else
return new Order(customer, product);
}
Run Code Online (Sandbox Code Playgroud)
但是,我不会盲目地将其作为一般模式.