您好,我正在处理我的C++问题。

这是代码

Cell.h

#ifndef CELL_H
#define CELL_H
#include <iostream>
#include <stdlib.h>
#include <time.h>


using namespace std;

class Cell
{

private:

    int level;
    int row;
    int column;

    //declares a variable called ptrFunction_array which is an array of 3 function pointers.
    typedef void (*ptrFunction[])(void);

    static void function1()
    {
        cout << "I'm function 1";
    }

    static void function2()
    {
        cout << "I'm function 2";
    }

    static void function3()
    {
        cout << "I'm function 3";
    }

public:
    Cell(int currentLevel, int currentRow, int currentColumn)
    {
        level = currentLevel;
        row = currentRow;
        column = currentColumn;

        ptrFunction = new *fArray[3];
        fArray[0] = function1();
        fArray[1] = function2();
        fArray[2] = function3();
    }
    virtual ~Cell();
    void tick()
    {
        int randomNumber = rand() % 3;

        cout << "Cell(" << level << ", " << row << ", " << column << ") ";

        fArray[randomNumber];
    }
};



#endif // CELL_H

Main.cpp
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include "Cell.h"

using namespace std;


Cell ****myArray;

int main()
{
    int level = 0;
    int row = 0;
    int column = 0;
    char userInput = 'y';

    srand (time(NULL));

    do
    {
        cout << "Please input the amount of levels: ";
        cin >> level;
        cout << "Please input the amount of rows: ";
        cin >> row;
        cout << "Please input the amount of columns: ";
        cin >> column;
        cout << endl;

        myArray = new Cell *** [level];

        // Set random number to the elements of the array
        for (int currentLevel = 0; currentLevel < level; currentLevel++)
        {
            myArray [currentLevel] = new Cell ** [row];

            for (int currentRow = 0; currentRow < row; currentRow++)
            {
                myArray [currentLevel][currentRow] = new Cell * [column];

                for (int currentColumn = 0; currentColumn < column; currentColumn++)
                {
                    myArray [currentLevel][currentRow][currentColumn] = new Cell (currentLevel, currentRow, currentColumn);
                    myArray [currentLevel][currentRow][currentColumn] -> tick();
                    cout << " ";
                }
                cout << endl;
            }
            cout << endl;
        }

        cout << "Do you want to try again? (y / n) ";
        cin >> userInput;

        cout << endl;

        if ((userInput == 'y') || (userInput == 'Y'))
        {
            for (int currentLevel = 0; currentLevel < level; currentLevel++)
            {
                for (int currentRow = 0; currentRow < row; currentRow++)
                {
                    for (int currentColumn = 0; currentColumn < column; currentColumn++)
                    {
                        delete[] myArray[currentLevel][currentRow][currentColumn];
                    }
                    delete[] myArray[currentLevel][currentRow];
                }
                delete[] myArray[currentLevel];
            }
            delete[] myArray;
            myArray = NULL;
        }

    }while (userInput != 'n');

    return 0;
}

我注意到我的fArray不在范围内。行ptrFunction = new *fArray[3];是我的错误所在。我最近开始学习C++,所以我正试图了解为什么typedef void (*ptrFunction[])(void);不能正确初始化程序的fArray。我程序的目标是能够创建3维数组,并能够指向单元对象并能够跟踪x,y,z位置。

为什么会发生这样的错误?

最佳答案

我现在暂时忽略四星指针,并坚持给OP带来最直接痛苦的原因。
快速演练:

Cell(int currentLevel, int currentRow, int currentColumn)
{
    level = currentLevel;
    row = currentRow;
    column = currentColumn;
到这里还不错。但...
    ptrFunction = new *fArray[3];
这就是说,给变量ptrFunction分配了一个新分配的3 fArray数组,该变量必须已经存在并且不存在。这里的问题是ptrFunction已定义为类型,而不是变量。 fArray不是类型。
    fArray[0] = function1();
    fArray[1] = function2();
    fArray[2] = function3();
使用fArray作为变量,可以使这里出现的问题更加清楚。
}
Cell需要看起来更像这样,但不完全是这样。以后再说。
Cell(int currentLevel, int currentRow, int currentColumn)
{
    level = currentLevel;
    row = currentRow;
    column = currentColumn;

    ptrFunction * fArray = new ptrFunction[3];
现在,fArray是一个变量,它指向一个或多个ptrFunction类型的对象(但ptrFunction的定义有些破损),并将fArray指向三个ptrFunction。从技术上讲,它指向三个ptrFunction中的第一个。
    fArray[0] = function1();
    fArray[1] = function2();
    fArray[2] = function3();
}
现在我们有了一个fArray,但是它是一个local variable,它仅存在于Cell的构造函数的花括号之间。当构造函数存在时,指针消失。分配的内存不会丢失。如果没有fArray指向它,您将很难找到它来使用或删除它。 fArray需要更宽的scope,以便A)内存不会丢失,以及B)以便tickCell的其他成员可以看到它。
class Cell
{

private:

    ptrFunction * fArray;
    int level;
并在构造函数中:
Cell(int currentLevel, int currentRow, int currentColumn)
{
    level = currentLevel;
    row = currentRow;
    column = currentColumn;

    fArray = new ptrFunction[3];
修复了找不到fArray的问题。
我的建议是先使一个Cell工作,然后尝试使Cell的1维数组工作。如果有一个尺寸,则尝试两个尺寸。您可能会发现这就是您所需要的。
编辑
忘记提及这一点:指向成员函数的函数指针是绝对删除,以使其正确。 Here is a page on common pitfalls and how to avoid them.
这是我们如何避免在现代C++的此刻和现在中出现这种蓝精灵:std::bindstd::function。链接的文档页面底部的教程可能描述了如何在比我更好的情况下使用它们。

关于c++ - 未在此范围内声明“fArray”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35330046/

10-10 21:22