Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:全局变量与局部变量。使用什么?_C++_Global Variables_Local Variables - Fatal编程技术网

C++ C++;:全局变量与局部变量。使用什么?

C++ C++;:全局变量与局部变量。使用什么?,c++,global-variables,local-variables,C++,Global Variables,Local Variables,有时我想用全局变量,但我用局部变量代替。让我们有一些字体类: class Font { public: class Alignment { public: unsigned short currentAlignment; unsigned short FONT_ALIGN_LEFT = 0; unsigned short FONT_ALIGN_CENTER = 1; unsigned short FONT_ALIG

有时我想用全局变量,但我用局部变量代替。让我们有一些字体类:

class Font {
public:

    class Alignment {
    public:
        unsigned short currentAlignment;
        unsigned short FONT_ALIGN_LEFT = 0;
        unsigned short FONT_ALIGN_CENTER = 1;
        unsigned short FONT_ALIGN_RIGHT = 2;
        // etc....
    };

    Alignment alignment;

    void setFontAlignment( unsigned short fontAlignment ) {
        this->alignment.currentAlignment = fontAlignment;
    }

};
要使用此类,我们需要执行以下操作:

Font font;
font.setFontAlignment( font.alignment.FONT_ALIGN_CENTER );
// if we need to check currentAlignment we need to do:
if ( font.alignment.currentAlignment == font.alignment.FONT_ALIGN_CENTER ) {...} // looks a little bit awful :)
或者我们有另一种方法来做到这一点:

= Font.h =
#define FONT_ALIGN_LEFT 0
#define FONT_ALIGN_CENTER 1
#define FONT_ALIGN_RIGHT 2 
// etc....

class Font {
public:
    unsigned short currentAlignment;
    void setFontAlignment( unsigned short fontAlignment ) {
        this->currentAlignment = fontAlignment;
    }
}
要使用此选项,请执行以下操作:

#include "Font.h"
...
Font font;
font.setFontAlignment( FONT_ALIGN_CENTER );
if ( font.currentAlignment == FONT_ALIGN_CENTER ) {...} // looks a little bit better :)

哪一个更适合内存优化?为什么?你喜欢用哪一种?或者你知道一些更好的解决方案吗?

虽然总会有例外,但我通常会遵循(除其他外:-)以下准则:

  • 尽可能避免使用全球语言。仅限于适用的最小值 范围(在合理范围内)

  • 避免对编译器进行二次猜测,除非非常明显 情况


事实上,这是它们的组合。但让我们澄清一下。你的问题中没有提到任何全局变量。全局变量是在全局范围中定义的变量

使用面向对象编程的主要原因不是它的效率(因为它比纯过程代码慢),而是它对世界建模的能力。因此,在创建oop设计时,您不应该太在意资源(时间、内存),而应该关心它对世界建模的好坏

第二个版本很糟糕,因为它在全局范围中引入了很多常量,您希望避免这种情况。此外,它在封装数据方面做得非常糟糕(字体类的用户不应该关心对齐的值)

第一个版本更好,但是有一些问题。首先,您需要考虑您应该拥有的对象?您确实需要对齐对象吗?你可能需要它,但在这个特殊的例子中,我不明白为什么。因此,您可以让它模拟真实的世界,而无需引入一些人工元素:

class Font {
public:

    unsigned short currentAlignment;
    void alignLeft() {
        this->currentAlignment = 0;
    }
    void alignCenter() {
        this->currentAlignment = 1;
    }
    void alignRight() {
        this->currentAlignment = 2;
    }  
};

现在它很容易使用。我不必在全局范围内保留不必要的常量。现在,问题是当用户读取currentAlignment的值时会发生什么?当然,您不想使用常量,但不需要。这真的取决于你所模拟的世界。因为这是一个字体类,所以它应该是唯一真正关心对齐值的类。如果其他人需要该值,您可以使用一些方法,如isCenter(),当字体居中对齐时返回true。但是,我也会考虑让当前对齐私有化。< / P >枚举发生了什么?代码>字体.setFontAlignment(FontAlignment::FontAlignCenter)我认为当你的字体有“对齐”属性时,你会遇到比担心内存优化更大的问题。@KerrekSB,你是什么意思?:)@JavaRunner冒着替Kerrek说话的风险,我认为他是在说您需要进一步考虑您的对象模型。字体应该只描述字符的形状。对齐适用于字体中的字符或字符串,而不是字体本身。@brianbeuning,嗯,是的,谢谢我现在明白了。但这仅仅是为了举例:)为什么这种方法比使用这样的方法更好:font.alignment.font\u ALIGN\u CENTER或者简单地说:font.font\u ALIGN\u CENTER没有内部类对齐?在你的方法中,我们需要至少三个这样的函数来获取值:)如果我们想更改某个常量,我们需要在这两个地方进行更改,有时可能会让我们感到困惑:)是的,您需要更多的方法,但它们会使代码更可读并更好地封装。作为用户,我不应该关心这些常量的值。如果你让我在我的全局范围内引入大量常数,我会很在意。你可以定义一些类常量,这样你就不必在两个地方修改它们。这种方法比内部对齐类更好,因为对齐类不建模任何东西。至少,不是在这里。