2014-07-07 112 views
-1

我創建了一個基類和該類的數組。我想將這個數組傳遞給另一個類。我究竟做錯了什麼?有沒有更完美的方法來完成這個?在C++中將對象數組傳遞給另一個類

class WaypointClass 
{ 
private: 
    float latitude, longitude; 
public: 
    WaypointClass(int lt, int lg) 
    { 
     latitude = lt; 
     longitude = lg; 
    } 
}; 

class WaypointList 
{ 
private: 
    int currentWaypoint; 
    WaypointClass *waypointList; 

public: 
    WaypointList(WaypointClass *waypoints) 
    { 
     waypointList = &waypoints; 
     currentWaypoint = 0; 
    } 
}; 

const WaypointClass waypoints[] = 
{ WaypointClass(1, 2), WaypointClass(3, 4), WaypointClass(5, 6) }; 

WaypointList myWaypoints(&waypoints); 
+2

究竟什麼不起作用? – xmoex

+0

我認爲這是waypointList = waypoints;而不是waypointList =&waypoints;因爲waypointList不是** – Lefsler

+0

我得到以下錯誤:錯誤:沒有匹配的函數調用'WaypointList :: WaypointList(const WaypointClass(*)[3])' – user3813960

回答

4

不知道你的錯誤信息是什麼,我馬上就可以看到一對夫婦的錯誤:

您聲明您的數組爲const,這意味着每一個元素不能被改變。但WaypointList接受一個非const指針,這意味着它期望能夠改變每個元素。這可能是你的編譯器錯誤。

此外,foo []自動轉換爲foo *,因此您不需要使用&取消引用您的數組。

你的第二個問題是你將數組傳遞過來,但是你不會傳遞數組的長度,這意味着WaypointList將不知道數組中有多少個航點。

+0

@ user3813960評論不是提問的正確方式。沒有人可以閱讀你的代碼示例,以及如何以堆棧溢出的方式回答它? – xmoex

0
  1. 當您將數組作爲參數傳遞時,不應該使用引用運算符(&)來傳遞它。這樣你就傳遞指向該數組的指針,這不是你想要的。

  2. 如果數組必須被聲明爲const,也是在函數簽名的參數應該是const e.x:WaypointList(const WaypointClass *waypoints)

0

你真的應該使用std::vector而不是陣列。

你也應該在正文中使用初始化列表在構造函數,而不是分配的,如果你的成員變量是float S,你應該使用在你的構造函數的參數列表,而不是int

所以這個:

WaypointClass(int lt, int lg) 
{ 
    latitude = lt; 
    longitude = lg; 
} 

變爲這樣:

WaypointClass(float lt, float lg) 
    : latitude(lt) 
    , longitude(lg) 
{} 

如果你使用的載體,你將不再需要WaypointList類。

在這裏,有一定的參考:http://en.cppreference.com/w/cpp/container/vector

0

我想我會接近它略有不同。我會使用std::vector來包含航點列表。如果你使用C++ 11(你爲什麼不這樣做?),你可以定義一個構造函數來直接接受括號內的初始化列表。一個完整的程序展示瞭如何做到這一點是在這裏:

#include <algorithm> 
#include <initializer_list> 
#include <iostream> 
#include <vector> 

class WaypointClass 
{ 
private: 
    float latitude, longitude; 
public: 
    WaypointClass(float lt, float lg) : latitude(lt), longitude(lg) {} 
    friend std::ostream& operator<<(std::ostream &out, const WaypointClass &wp) 
    { 
     return out << "(" << wp.latitude << ", " << wp.longitude << ')'; 
    } 
}; 

class WaypointList 
{ 
private: 
    std::vector<WaypointClass> m_vector; 
public: 
    WaypointList(std::initializer_list<const WaypointClass> w) 
     : m_vector(w.begin(), w.end()) {} 
    friend std::ostream &operator<<(std::ostream &out, const WaypointList &wl) { 
     for (const auto &wp : wl.m_vector) 
      out << wp << '\n'; 
     return out; 
    } 
}; 

int main() 
{ 
    WaypointList myWaypoints{ WaypointClass(1, 2), WaypointClass(3, 4), 
     WaypointClass(5, 6) }; 
    std::cout << myWaypoints << '\n'; 

} 

正如預期的那樣,這個打印:

(1, 2) 
(3, 4) 
(5, 6) 

當然,你需要添加更多的類,使他們真正有用的,但這說明了這些概念。

相關問題