[英]Passing Array of Objects to Another Class in 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);
不知道您的錯誤消息是什么,我可以立即看到幾個錯誤:
您將數組聲明為const,這意味着每個元素都無法更改。 但是WaypointList
接受一個非常量指針,這意味着它希望能夠更改每個元素。 這可能是您的編譯器錯誤。
另外, foo[]
自動轉換為foo*
,因此您不需要使用&取消引用數組。
第二個問題是您將數組傳遞過來,但是沒有傳遞數組的長度,這意味着WaypointList
將不知道數組中有多少個路標。
當將數組作為參數傳遞時,不應使用reference-operator(&)傳遞它。 這樣,您將指針傳遞給該數組,這不是您想要的。
如果必須將數組聲明為const,則函數簽名中的參數也應為const ex: WaypointList(const WaypointClass *waypoints)
您應該真正使用std::vector
而不是數組。
另外,您應該在構造函數中使用初始化程序列表,而不要在主體中使用Assign;如果成員變量為float
,則應在構造函數參數列表中使用它而不是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
我想我會略有不同。 我將使用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)
當然,您需要向類中添加更多內容以使其真正有用,但這說明了這些概念。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.