2011-03-31 70 views
0

您好 我來形成Java陣營中的「空」插槽,我試圖做一個C++程序檢查一個對象數組

我有一個名爲清單的數組,需要乘客對象

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

明顯的'instanceOf'是C++中的一個問題, 我知道是== null不起作用,因爲沒有這樣的事情,因爲沒有被具體插入的空 但建立一個空白乘客對象,然後插入它們在每個數組插槽聽起來雜亂而昂貴。 有沒有更優雅的方式?

謝謝

回答

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

你真的不能創建在C++ 對象的數組沒有構建所有這些(當然,實際上,你可以,但這是醜陋的,黑魔法的東西。)不要使用數組 - 使用std :: vector。

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

1

您可以null在C++中,只要你持有的對象指針。

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 <>,但對於學習C++後的Java,這做使用原始指針水平低的方式鍛鍊可能是有益的。

0

謝謝大家對你幫助

我是在什麼樣的數據結構,我被允許使用 限制(我想到了一個地圖會是一個更好的選擇,但他們選擇了陣列....)

這裏是我如何解決問題到最後

作爲弗裏德曼山如此正確地提到當我動態地創建我的數組它需要一個類型的乘客的空白構造函數initalise。 我只是添加了一個私人數據成員布爾「isEmpty」initalised爲false到我的構造函數。 然後檢查就像這樣:

如果(艙單[I] .getIsEmpty()!)再次

感謝