我有一个名为Manifest的数组,它接收乘客对象
for (int i = 0; i< _totalSeats; i++)
{
if (Manifest[i] != instanceOf Passenger) {
cout<<"empty"endl;
}
else {
cout<< PassengerToString(i);
}
}
显然'instanceOf'是C ++中的一个问题, 我知道是= = null不起作用,因为没有特定插入没有null这样的东西 但要建立一个空白的乘客对象,然后将它们插入每个阵列插槽听起来凌乱和昂贵。 有更优雅的方式吗?
感谢
答案 0 :(得分:3)
听起来你正在将座位映射到乘客身上。这意味着map
可能是更好的选择,例如std::map<int, Passenger> Manifest
。
例如
#include <map>
#include <string>
#include <iostream>
class Passenger
{
public:
std::string toString() const
{
return "Passenger";
}
};
int main()
{
std::map<int, Passenger> Manifest;
Manifest[2] = Passenger();
int _totalSeats = 10;
for (int i = 0; i< _totalSeats; i++)
{
if (Manifest.count(i))
std::cout << Manifest[i].toString() << '\n';
else
std::cout << "empty\n";
}
}
答案 1 :(得分:1)
你无法在C ++ 中创建一个对象数组而不用构建它们(实际上,你可以,但它是丑陋的,黑魔法的东西。)不要使用数组 - 使用std :: vector。
答案 2 :(得分:1)
最干净的方法是仅存储容器中有效的对象。因此,您可以使用std::vector<Passenger>
代替使用固定大小的数组,并根据需要添加和删除Passenger
。
如果Passenger
个对象的位置很重要(即索引很重要),您可以轻松使用std::map<int, Passenger>
。
否则,有许多方法可以解决这个问题:
使用智能指针容器(例如,std::vector<std::unique_ptr<Passenger>>
或std::vector<std::shared_ptr<Passenger> >
)或指针容器(例如,boost::ptr_vector<Passenger>
)并存储指向动态分配对象的指针。
使用指定的“空对象”(您描述的方法)。 “空对象”是对象的默认状态还是显式设置状态取决于您。
使用struct { bool valid_; Passenger object_; };
的容器作为粗略的“可选”类型包装器(这需要Passenger
是默认的可构造的,但不要求默认的构造对象有意义)。
答案 3 :(得分:1)
如果你持有对象指针,你可以在C ++中拥有null
。
struct Passenger
{
std::string name_;
};
std::string PassengerToString(const Passenger& p)
{
return p.name_;
}
int main()
{
const int _totalSeats= 10;
Passenger* Manifest[_totalSeats] = {0};
for (int i = 0; i< _totalSeats;i++)
{
if (Manifest[i] != 0)
{
std::cout<<"empty" << std::endl;
}
else
{
std::cout<< PassengerToString(*Manifest[i]) << std::endl;;
}
}
return 0;
}
对于真正的生产代码,你会使用像shared_ptr&lt;&gt;这样的东西,但是对于学习C ++后Java的练习,使用原始指针的低级方法可能是有益的。
答案 4 :(得分:0)
谢谢大家的帮助
我被限制在允许使用的数据结构中 (我认为地图本来是一个更好的选择,但是他们选择了数组....)
这是我最终解决问题的方法
正如弗里德曼 - 希尔如此正确地提到我动态创建我的数组时,它需要一个类型为Passenger的空白构造函数来初始化。 我只是向我的consturctor添加了一个私有数据成员bool“isEmpty”initalised to false。 然后像这样检查:if(!Manifest [i] .getIsEmpty())
再次感谢