这里的“static const”有什么意义?为什么没有它结果会很荒谬?

问题描述 投票:0回答:1

我无法完全理解下面编写的代码的问题。按照我的逻辑,它应该完美地工作,但事实并非如此。它会产生一个奇怪的结果,如“52428”。我的第一个问题是:这个结果到底来自哪里?在哪里进行转换过程来显示这个数字?

为了解决这个问题,我需要将“static const”添加到“warrior”类的私有变量中。并且问题神奇地解决了。我的第二个问题是:“static const”在这里到底做什么并解决问题?除了“static const”之外,还有什么方法可以解决这个问题?

1:

definition.h

#pragma once

typedef unsigned short uns;

2:

Hp.h

#pragma once
#include "definition.h"

class HP {
private:
    uns maxHp;

public:

    HP(uns mHP) {
        maxHp = mHP;
    }
    uns getHP() { return maxHp; }

};

3:

States.h

#pragma once
#include "definition.h"

class STATES {
private:
    uns BStrength;
    uns BIntellect;

public:
    
    STATES(uns bstr, uns bint) {
        BStrength = bstr;
        BIntellect = bint;
    }

    uns getStrength() { return BStrength; }
    uns getIntellect() { return BIntellect; }

};

4:

Warrior.h

#pragma once
#include "definition.h"
#include "States.h"
#include "Hp.h"

class Warrior : public HP, public STATES {
private:
    uns hp = 100;
    uns Strength = 20;
    uns Intellect = 5;
public:
    Warrior() : HP(hp), STATES(Strength, Intellect) {}


};

5:

main.cpp

#include <iostream>
#include "Warrior.h"


int main()
{
    Warrior warr1;
    Wizard wiz1;

    std::cout << warr1.getHP() << " " << warr1.getStrength() << " " << warr1.getIntellect() << "\n";

    
}

结果: 52428 52428 52428

2.1:

Warrior.h
,具有静态成员:

#pragma once
#include "definition.h"
#include "States.h"
#include "Hp.h"

class Warrior : public HP, public STATES {
private:
    static const uns hp = 100;
    static const uns Strength = 20;
    static const uns Intellect = 5;
public:
    Warrior() : HP(hp), STATES(Strength, Intellect) {}


};

第二个结果: 100 20 5

c++ static constants
1个回答
0
投票

如果这些值不是恒定的(例如,它们在主循环中运行时是动态的),那么 static const 将不允许它们被更改。如果变量在程序的整个生命周期中从未发生变化,这些定义可以节省内存并减少错误。

在这种情况下,将这些变量定义为 uns 似乎不适合我。从长远来看,将它们定义为 unsigned int 可能会节省一些位,而 int 很可能就足够了。此外,根据需要在标头中定义变量并在 cpp 文件中赋值是更好的做法。如果您遵循这些比您所提供的更好的实践指南,您的错误将会消失。

© www.soinside.com 2019 - 2024. All rights reserved.