首页 > 解决方案 > 指向类的指针的 C++ 函数不起作用?

问题描述

我正在尝试使用 perlin 噪声生成地形,以提高地形质量,我想一次使用多个噪声。所以我写了一个适合我的课程。以下是 hpp 和 cpp 文件:

#include "perlinNoise.hpp"

class MultiPerlinNoise: public PerlinNoise {
public:
    MultiPerlinNoise();

    std::vector<PerlinNoise*> perlinNoises;

    float octaveNoise(float x, float y);
};

cp:

#include "multiPerlinNoise.hpp"

MultiPerlinNoise::MultiPerlinNoise():
PerlinNoise(0) {

}

float MultiPerlinNoise::octaveNoise(float x, float y) {
    float sum = 0.0f;

    for(int i = 0; i < perlinNoises.size(); i++)
        sum += perlinNoises[i]->octaveNoise(x, y);

    return sum;
}

该类PerlinNoise是我在互联网上发现的八度音阶危险噪声代码的包装器。它看起来像这样:

#include "sivPerlinNoise.hpp"

class PerlinNoise {
public:
    PerlinNoise(unsigned int seed);

    float octaveNoise(float x, float y);

    float frequency;
    float multiplier;
    int octaves;
    unsigned int seed;
    float offset;

private:
    siv::PerlinNoise perlinNoise;
};

cp:

#include "perlinNoise.hpp"

PerlinNoise::PerlinNoise(unsigned int seed):
perlinNoise(seed), frequency(2.0f), multiplier(1.0f), octaves(1), seed(seed), offset(0.0f) {

}

float PerlinNoise::octaveNoise(float x, float y) {
    return perlinNoise.octaveNoise(x / frequency, y / frequency, octaves) * multiplier + offset;
}

现在的问题是,当我将指向噪声的指针传递给我的map类时,函数总是返回0.0f。这就是我的地图类的构造函数的样子:

Map::Map(PerlinNoise *noise, Shader *shader, const RenderData *data):
noise(noise), shader(shader), data(data), texture("resources/textures/stones.png") {
    printf("%f\n", noise->octaveNoise(-(CHUNK_SIZE / 2.0f) + 0.0f, -(CHUNK_SIZE / 2.0f) + 0.0f));
    update(glm::vec3(0.0f));
}

当我不使用指向噪音的指针时,一切都在正常工作。如何解决这个问题?

标签: c++classpointers

解决方案


您需要声明octaveNoise为虚拟,因此可以通过继承类来覆盖该方法:

class MultiPerlinNoise: public PerlinNoise {
public:
    MultiPerlinNoise();

    std::vector<PerlinNoise*> perlinNoises;

    virtual float octaveNoise(float x, float y);
};

推荐阅读