对'Class :: StaticStructMember'的未定义引用

时间:2017-07-04 14:46:17

标签: c++ eclipse sdl

此代码旨在帮助分析游戏代码 - 我似乎无法理解为什么它不起作用。我收到以下错误消息:未定义引用`ProfileSample :: profileSamples',另一个用于我使用其成员的每个点。

#ifndef PROFILER_HPP_
#define PROFILER_HPP_

#define MAXIMUM_PROFILE_SAMPLES 16

class ProfileSample {
private:
    int sampleIndex, parentIndex;
    static int previousSampleIndex;

    inline float getTime(void) {
        return ((float)SDL_GetTicks()) / 1000.0f;
    }

    static struct profileSamples {
        float start, duration;
        char *name;
    } profileSamples[MAXIMUM_PROFILE_SAMPLES];
public:
    ProfileSample(const char *name) {
        sampleIndex = 0;
        while(profileSamples[sampleIndex].name != NULL)
            sampleIndex ++;

        parentIndex = (sampleIndex > 1) ? previousSampleIndex : -1;
        previousSampleIndex = sampleIndex;
        profileSamples[sampleIndex].name = (char *)name;
        profileSamples[sampleIndex].start = getTime();
    }

    ~ProfileSample(void) {
        float end = getTime();
        profileSamples[sampleIndex].duration = (end - profileSamples[sampleIndex].start);
        if(parentIndex >= 0)
            profileSamples[parentIndex].start -= profileSamples[sampleIndex].duration;
        if(sampleIndex == 0)
            output();
    }

    static void output(void) {
        for(int i = 1; i < MAXIMUM_PROFILE_SAMPLES; i ++) {
            printf("\nName: %s"
                    "\nDuration: %f"
                    "\nOverall percentage: %f",
                    profileSamples[i].name,
                    profileSamples[i].duration,
                    (profileSamples[0].duration / 100) * profileSamples[i].duration);
        }
    }
};

#endif /* PROFILER_HPP_ */

有人可以解释我在这里缺少的东西吗?变得简单,我只是离开了C for C ++

1 个答案:

答案 0 :(得分:0)

 static struct profileSamples {
        float start, duration;
        char *name;
    } profileSamples[MAXIMUM_PROFILE_SAMPLES];

您刚刚声明了这个静态结构。 你还没有真正初步化它。

如果你添加

    struct ProfileSample::profileSamples  ProfileSample::profileSamples[16] = {};
int ProfileSample::previousSampleIndex = 1;

在课程声明之后,它实际上将解决问题。

您可以将其视为第二步,即用实际数据填充内存。第一个是描述将使用一些内存以及解释数据将具有什么。

希望这一点与评论中标记的问题相结合,可以帮助您了解正在发生的事情。