我现在正从 Java 转向 C++,每当 Java 中常用的概念不能直接映射到 C++ 时,我就会遇到一些困难。例如,在 Java 中我会这样做:
Fruit GetFruit(String fruitName) {
Fruit fruit;
if(fruitName == "apple") fruit = new Fruit("apple");
else if(fruitName == "banana") fruit = new Fruit("banana");
else fruit = new Fruit("kumquat"); //'cause who really wants to eat a kumquat?
return fruit;
}
当然,在C++中Fruit fruit;
语句实际上创建了一个水果。这是否意味着我必须有一个默认构造函数?这看起来不安全!如果我的默认水果逃脱了怎么办?
当涉及到创建水果时,C++ 会让你更加头疼。根据您的需要,您可以选择以下选项之一:
1)在堆栈上创建一个 Fruit 并返回一个副本(您需要一个复制构造函数),然后必须提供一些默认的 Fruit 以防名称不匹配:
Fruit GetFruit(const std::string &name)
{
if ( name == "banana" ) return Fruit("banana");
if ( name == "apple" ) return Fruit("apple");
return Fruit("default");
}
2)在堆上创建一个 Fruit 并注意,可能会返回空指针,并记住在某处删除该 Fruit 并注意它仅被删除一次且仅由其所有者删除(并注意没有人持有指向被删除水果的指针):
Fruit* GetFruit(const std::string &name)
{
if ( name == "banana" ) return new Fruit("banana");
if ( name == "apple" ) return new Fruit("apple");
return NULL;
}
3)最后,使用智能指针来避免许多可能的指针问题(但要注意空指针)。此选项最接近您的 Java 编程经验:
typedef boost::shared_ptr<Fruit> FruitRef;
FruitRef GetFruit(const std::string &name)
{
if ( name == "banana" ) return new Fruit("banana");
if ( name == "apple" ) return new Fruit("apple");
return FruitRef();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)