c++ - 指向 void 函数中的类的指针

标签 c++ class pointers inheritance

我正在学习类/继承/指针在 C++ 中的工作方式并编写以下代码。

我有一个类 unit 声明为:

class unit{
    public:
        int locationX,locationY;

        //genotype (does not change)
        float agility, build,size,stamina, aggression;
        //phenotype (changes based on genotype and stimuli)
        float speed, strength, hunger;
};

当我创建一个新实例以传递给 void 函数时(分别在下面),内存尚未分配。

实例

unit **units = 0;

无效函数原型(prototype)

void initialize(grid *grids, unit **units /*, plant **plants, predator **predators */);

内存是在 void 函数中使用一些参数分配的:

void initialize(grid *grids, unit **units,plant **plants,predator **predators)
{
    units = new unit*[int(((grids->gridHeight)*(grids->gridWidth)*(grids->gridDivision))/20)];

    for(register int i = 0; i<int(((grids->gridHeight)*(grids->gridWidth)*(grids->gridDivision))/20); i++)
        {
        units[i] = new unit;
        units[i]->hunger = 5;
        units[i]->locationX = (rand()%((grids->gridWidth)-0));
        units[i]->locationY = (rand()%((grids->gridHeight)-0));
        //etc, etc
    }
}

但是,一旦我退出 void 函数,我刚刚存储的数据就会被删除。指针声明和传递到函数中是否有问题(如下)?

initialize(&environment, units, plants, predators);

注意:我只有在 unit 类下声明的 units 变量有问题。 环境 变量没问题。其他两个(植物捕食者)与单位 类似,所以如果这个修复了,我可以修复其他的。

第二个注意事项:主要功能如下(相关部分):

int main()
{
    unit **units = 0; //<--- Important one
    plant **plants = 0;
    predator **predators = 0;
    grid environment(250,250,5); //Constructor for environment (don't mind this)
    initialize(&environment, units, plants, predators); //<-- Void function
    running = true;

    return 0;
}

感谢您提供的任何帮助/链接/解释。

最佳答案

您将 units 按值 传递给函数。这意味着函数中的 units 指针开始时是调用代码中指针的拷贝。在函数中,您为本地 units 变量分配一个新值(即一些新创建对象的地址)。然后当函数终止时,局部变量超出范围并且它指向的对象丢失。调用代码中的指针永远不会被修改,并且对此一无所知。

改为通过引用传递:

void initialize(grid *grids, unit ** &units)

关于c++ - 指向 void 函数中的类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17757928/

相关文章:

c++ - 具有静态方法的类或具有普通方法的类

c++ - 构造函数不能用于初始化

c++ - Mac 上的段错误 11,C++ unsigned int 声明

c++ - 停止 Qt 脚本的评估

c++ - 如何将 __declspec(align(16)) 与模板一起使用?

c++ - 数组基地址歧义

c++ - 为什么我在函数内部使用引用并通过引用返回它仍然有效?

c - C 中指针作为参数

c++ - 创建作为运算符(operator)工作的方法

c++ - 运算符重载使用operator +作为类模板