用C ++将对象数组传递给另一个类

时间:2014-07-07 20:49:21

标签: c++ arrays class

我创建了一个基类和该类的数组。我试图将此数组传递给另一个类。我究竟做错了什么?是否有更优雅的方法来实现这一目标?

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);

4 个答案:

答案 0 :(得分:4)

不知道您的错误消息是什么,我可以立即看到一些错误:

您将数组声明为const,这意味着无法更改每个元素。但是WaypointList接受一个非const指针,这意味着它希望能够改变每个元素。这可能是您的编译器错误。

此外,foo[]会自动转换为foo*,因此您无需使用&取消引用您的数组。

你的第二个问题是你传递了数组,但你没有传递数组的长度,这意味着WaypointList将不知道数组中有多少个路点。

答案 1 :(得分:0)

  1. 当您将数组作为参数传递时,不应使用reference-operator(&)传递它。这样你就可以将指针传递给那个数组,这不是你想要的。

  2. 如果必须将数组声明为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类。

在这里,有一些参考:http://en.cppreference.com/w/cpp/container/vector

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

当然,您需要在类中添加更多内容才能使它们真正有用,但这说明了这些概念。