我创建了一个基类和该类的数组。我试图将此数组传递给另一个类。我究竟做错了什么?是否有更优雅的方法来实现这一目标?
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);
答案 0 :(得分:4)
不知道您的错误消息是什么,我可以立即看到一些错误:
您将数组声明为const,这意味着无法更改每个元素。但是WaypointList
接受一个非const指针,这意味着它希望能够改变每个元素。这可能是您的编译器错误。
此外,foo[]
会自动转换为foo*
,因此您无需使用&取消引用您的数组。
你的第二个问题是你传递了数组,但你没有传递数组的长度,这意味着WaypointList
将不知道数组中有多少个路点。
答案 1 :(得分:0)
当您将数组作为参数传递时,不应使用reference-operator(&)传递它。这样你就可以将指针传递给那个数组,这不是你想要的。
如果必须将数组声明为const,那么函数签名中的参数也应该是const e.x:WaypointList(const WaypointClass *waypoints)
答案 2 :(得分:0)
您应该使用std::vector
而不是数组。
此外,您应该在构造函数中使用初始化列表而不是在正文中指定,如果您的成员变量是float
,则应该在构造函数参数列表中使用它而不是int
。< / p>
所以这个:
WaypointClass(int lt, int lg)
{
latitude = lt;
longitude = lg;
}
成为这个:
WaypointClass(float lt, float lg)
: latitude(lt)
, longitude(lg)
{}
如果您使用向量,则不会需要WaypointList
类。
答案 3 :(得分: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)
当然,您需要在类中添加更多内容才能使它们真正有用,但这说明了这些概念。