【问题标题】:pointers to a multidimensional array in classes指向类中的多维数组的指针
【发布时间】:2013-04-18 03:30:31
【问题描述】:

我正在尝试找出错误的根源,不知道您能否提供帮助?我现在对数组指针有点问题。我有三个班级,可以这么说,一位家长和两个孩子。其中一个孩子有一个 struct 类型的二维数组,我正在尝试从另一个孩子访问它的元素。

我想知道,这段代码对我的数组指针的格式/语法是否有效? OChild1 创建并填充二维数组,我将指向该数组的指针保存在 Parent 中,并将该指针传递给 OChild2,然后计划使用数组的内容进行进一步处理。

struct BOARDTILE
{
    float fPosX;
    float fPosY;

    BOARDTILES()
    {
        fPosX = 0.0f;
        fPosY = 0.0f;
    }
};

class CChild1
{
    public:
        BOARDTILE BoardTileArray[18][18];

    CChild1()
    {
    }

    writeBoardTileArray()
    {
        for (int i = 0; i <= 17; i++)
        {
            for (int j = 0; j <= 17; j++)
            {
                BoardTileArray[i][j].fPosX = (float) i * 5.0f;
                BoardTileArray[i][j].fPosY = (float) j * 7.0f;
            }
        }
    }
};

class CChild2
{
    public:
        BOARDTILE (*pBoardTileArray)[18][18];
        float fPosX;
        float fPosY;

    CChild2()
    {
    }

    void readBoardTileArray()
    {
        for (int i = 0; i <= 17; i++)
        {
            for (int j = 0; j <= 17; j++)
            {
                fPosX = (*pBoardTileArray[i][j]).fPosX;
                fPosY = (*pBoardTileArray[i][j]).fPosY;
                cout << fPosX;
                cout << fPosY;
            }
        }
    }

};

class CParent
{
    public:
        BOARDTILE (*pBoardTileArray)[18][18];
        CChild1 OChild1;
        CChild2 OChild2;

    CParent()
    {
        OChild1.writeBoardTileArray();
        pBoardTileArray = &(OChild1.BoardTileArray);
        OChild2.pBoardTileArray = pBoardTileArray;
    }
};

【问题讨论】:

    标签: c++ pointers multidimensional-array


    【解决方案1】:

    要存储二维数组的地址,你需要一个指向指针的指针,

    没有 typedef:
    您可以将成员指针声明为:

    BOARDTILE (*pBoardTileArray)[18];
    

    然后在构造函数中,你会写:

        pBoardTileArray = OChild1.BoardTileArray;
    

    但正如您所见,它使代码变得复杂。使用typedef 可以简化它:

    使用 typedef:(推荐方式)
    使用typedef,您可以在全局范围内编写以下内容:

    typedef BOARDTILE BOARDTILE_ar18_t[18];
    

    然后你可以将成员指针声明为:

    BOARDTILE_ar18_t* pBoardTileArray;
    

    【讨论】:

    • 感谢您的回复。那么,我是否需要在“BOARDTILE (* pBoardTileArray)[18][18];”上方写下这一行作为 BOARDTILE ( * * pBoardTileArray)[18][18];反而?或者也许是“BOARDTILE* (* pBoardTileArray)[18][18];”?如果我将其声明为 BOARDTILE** pBoardTileArray;我似乎收到以下行的转换错误: pBoardTileArray = &(OChild1.BoardTileArray);您能否提供指向我可以了解更多信息的页面的链接?
    • 或者怎么样... BOARDTILE (*(*pBoardTileArray)[18])[18]; ?
    • 非常感谢,非常感谢您的帮助。我现在唯一的问题是如何在将指向它的指针传递给另一个对象后读取 2D 数组的内容。如果这有什么不同,我现在正在使用没有 typedef 的版本?我想我正在慢慢开始理解这个概念,但这绝对是一个滑溜溜的话题。我认为难以掌握的部分是数组是一组开始的指针。
    • 我正在尝试使用以下行访问数组: fPosX = (*pBoardTileArray[i][j]).fPosX; fPosX = (*pBoardTileArray[i])[j].fPosX; fPosX = (*pBoardTileArray)[i][j].fPosX;或 fPosX = *pBoardTileArray[i][j].fPosX;但这些似乎都不起作用。
    • 如果我认为 pBoardTileArray 是指向数组中某个维度的指针,我还尝试在 CChild2 中创建一个名为 BoardTileArrayTwo[18][18] 的新二维数组,并且尝试使用以下行: fPosX = BoardTileArrayTwo[(*pBoardTileArray)[i].nSomeInt][j].fPosX;令我惊讶的是这个编译。这是正确的做法吗?虽然程序仍然崩溃,但如果我朝着正确的方向前进,这肯定会有所帮助。
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多