0

我在尝试从另一个类访问我的主类中使用的数组时遇到问题。我的应用程序是用于制作 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++ 还是很陌生!

4

1 回答 1

4

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

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

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

mapSeg这一切都很好,但是你对构造函数中的参数什么都不做。如果要访问数组,则需要将该指针存储在某处。您可以通过将被调用的成员更改为:SegmentPanelmapSeg

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”。然后,您需要使成员mapSeg具有相同的类型。

于 2013-03-28T14:32:46.510 回答