使用C ++从另一个类访问一个类中的数组

时间:2013-03-28 14:25:25

标签: c++ arrays pointers

我在尝试从另一个类访问我的主类中使用的数组时遇到了麻烦。我的应用程序是一个用于制作2D平台游戏的编辑器 - 它基本上允许您放下2D资产(片段)并建立一个级别。

我的主类处理一组地图段类(数组中的每个段类都包含地图上段的位置,比例和旋转等信息)并将它们绘制到屏幕上。

我有一个单独的类,它基本上是一个面板(可拖动,可调整大小,就像你在Photoshop中找到的那样),它在主类中初始化,用于从文件中绘制可用段的网格。我需要的是能够点击其中一个段,然后将信息添加到主类中引用的数组。

我的主类“Map”声明了一个数组:

map.h(简化)

class Map
{
public:
  MapSegment* mapSeg[512];
};

我在创建面板时尝试发送该数组的引用以显示可用的段,如下所示:

Panel* segmentPane = new SegmentPanel(sf::Rect<float>(200,200,250,200), mapSeg);

Segment Panel标题形成如下:

class SegmentPanel : public Panel
{
public:
    SegmentPanel(sf::Rect<float> _position, MapSegment* mapSeg[512];);
    void Update();
    void Draw(sf::RenderWindow & renderWindow);
    void ReadSegments();
private:
    std::vector<SegmentDefinition *> segDef;
    MapSegment* mapSeg[512];
};

和SegmentPanel cpp:

SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment* mapSeg[512])
    : Panel(_position)
{
    panelTitle = "Segment Selection";
}

void SegmentPanel::Update()
{
    // Update segments
}

void SegmentPanel::Draw(sf::RenderWindow & renderWindow)
{
    // Draw default panel items
    Panel::Draw(renderWindow);

// Draw segments
}

但是,从SegmentPanel.cpp类向数组添加元素似乎没有反映在我的主Main类中 - 它似乎在内存中创建了一个新数组。

使用C#后,我仍然是C ++的新手!

1 个答案:

答案 0 :(得分:4)

首先,C ++中没有数组参数类型。在SegmentPanel构造函数中,MapSegment* mapSeg[512]参数实际上等同于MapSegment** mapSeg;它只是指向指针的指针!

Panel* segmentPane = new SegmentPanel(sf::Rect<float>(200,200,250,200), mapSeg);

在这里,您尝试传递数组mapSeg。这经历了数组到指针的转换,将其转换为指向其第一个元素(MapSegment**)的指针,然后传递该指针。

这很好,但是你对构造函数中的mapSeg参数没有任何作用。如果要访问该数组,则需要将该指针存储在某处。您可以将名为SegmentPanel的{​​{1}}的成员更改为:

mapSeg

然后将构造函数更改为:

MapSegment** mapSeg;

请注意成员初始化列表中SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment** mapSeg) : Panel(_position), mapSeg(mapSeg) { panelTitle = "Segment Selection"; } 的初始化。


另一种方法是改为使用引用数组类型参数。您的构造函数现在看起来像:

mapSeg

SegmentPanel::SegmentPanel(sf::Rect<float> _position, MapSegment* (&mapSeg)[512]) : Panel(_position), mapSeg(mapSeg) { panelTitle = "Segment Selection"; } 参数的类型是“对mapSeg的512个指针数组的引用”。然后,您需要使成员MapSegment具有相同的类型。