检查对象数组中的“null”槽

时间:2011-03-31 02:50:30

标签: c++

你好 我来自java阵营,我正在尝试做一个c ++程序

我有一个名为Manifest的数组,它接收乘客对象

for (int i = 0; i< _totalSeats; i++) 
{
    if (Manifest[i] != instanceOf Passenger) {
        cout<<"empty"endl;
    }
    else {
        cout<< PassengerToString(i);
    }
}

显然'instanceOf'是C ++中的一个问题, 我知道是= = null不起作用,因为没有特定插入没有null这样的东西 但要建立一个空白的乘客对象,然后将它们插入每个阵列插槽听起来凌乱和昂贵。 有更优雅的方式吗?

感谢

5 个答案:

答案 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";
         }
}

测试运行:https://ideone.com/XkNOg

答案 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是默认的可构造的,但不要求默认的构造对象有意义)。

  • 使用Boost.Optional

答案 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())

再次感谢