如何在构造函数 C++ 中使用静态变量?

Posted

技术标签:

【中文标题】如何在构造函数 C++ 中使用静态变量?【英文标题】:How to use a static variable in a constructor c++? 【发布时间】:2018-04-28 23:37:24 【问题描述】:

我在类构造函数中使用静态变量时遇到问题。我需要在构造函数的第一行初始化中设置两个等于零的值,但我不想在再次调用构造函数后将它们设置为零。这两个值将递增。因此,在了解了静态变量之后,我尝试在构造函数中使用静态变量,但出现了错误。

所以,我想要的是 horPos 和 vertPos 在构造函数中只设置一次为零,然后在另一个函数中递增。

IOMovement.cpp:

#include "stdafx.h"
#include <iostream>
#include <Windows.h>

#include "IOMovement.h" 
#include "rectangle.h"

#define W_KEY 0x57
#define S_KEY 0x53
#define A_KEY 0x41
#define D_KEY 0x44
#define R_KEY 0x52


void IOMovement::IO() 
    rectangle player(15, 5);

        if (GetAsyncKeyState(W_KEY)) 
            system("CLS");
            vertPos--;

            player.rectangleDrawPos(horPos, vertPos);
        

        if (GetAsyncKeyState(S_KEY)) 
            system("CLS");
            vertPos++;
            std::cout << "Working\n";
            player.rectangleDrawPos(horPos, vertPos);
        

        if (GetAsyncKeyState(A_KEY)) 
            system("CLS");
            horPos--;

            player.rectangleDrawPos(horPos, vertPos);
        

        if (GetAsyncKeyState(D_KEY)) 
            system("CLS");
            horPos++;

            player.rectangleDrawPos(horPos, vertPos);
        




void IOMovement::IOStartup() 
    //Variable decleration
    vertPos = 0;
    horPos = 0;

    //Functions
    IO();

IOMovement.h:

#ifndef IOMOVEMENT_H
#define IOMOVEMENT_H

class IOMovement 
    static int vertPos, horPos;

    void IO();

public:
    void IOStartup();
;



#endif

【问题讨论】:

"但我不想在再次调用构造函数后将它们设置为零。" - 你想让它们设置成什么?为什么你认为你需要这样做? 【参考方案1】:

此用例不需要静态。创建对象时,通常只调用一次构造函数。

因此,如果您不将它们声明为静态并使用构造函数以以下方式初始化它们: IOMovement::IOMovement() : vertPos(0), horPos(0) //Your constructor logic.

【讨论】:

【参考方案2】:

静态变量不会在构造函数中初始化,但可能会被修改。它们在类外初始化,例如:

int IOMovement::vertPos = 0, horPos = 0;

在 des/constructor 中,您可以对它们进行 idec/ncrement:

IOMovement::IOMovement()
      vertPos++;
      horPos++;


IOMovement::~IOMovement()
      vertPos--;
      horPos--;

【讨论】:

【参考方案3】:

实际上,当您设计一个类时,您可以在类中定义static 变量(成员),但您不能在定义它们的类中初始化它们。如果你想初始化一个静态类变量(成员),你可以在类之外,在源文件的其余部分这样做:

IOMovement.h

#ifndef IOMOVEMENT_H
#define IOMOVEMENT_H

class IOMovement 
    // Here you define IOMovement class variables.
    static int vertPos, horPos;

public:
    // I think, you must put this function in the
    // public function memebers of the class.
    void IO();
    void IOStartup();
;

#endif

IOMovement.cpp

#include "IOMovement.h"

...
// Here you initialize both static variables, at the source file
// before you use them.
IOMovement::vertPos = 0;
IOMovement::horPos = 0;
...

在构造函数中只能初始化非静态类成员变量。

In this page 更好地解释了如何初始化static 成员 c++ 中的一个类:

当第一个对象被初始化时,所有静态数据都被初始化为零 如果不存在其他初始化,则创建。我们不能把它放在 类定义,但它可以在类外初始化 使用范围解析运算符重新声明静态变量 :: 来识别它属于哪个类。

在 Stack Overflow 中的 answer 就是一个例子:

它们不能在类中初始化,但可以 在类之外的源文件中初始化:

// inside the class
class Thing 
    static string RE_ANY;
    static string RE_ANY_RELUCTANT;
;

// in the source file
string Thing::RE_ANY = "([^\\n]*)";
string Thing::RE_ANY_RELUCTANT = "([^\\n]*?)";

在这些页面中,您可以获得更多关于 static 成员 c++ 类的信息:

Static Members of a C++ Class

C++ initialize static variables in class?

Constructors (C++)

【讨论】:

对不起,没有。这是一个错误。

以上是关于如何在构造函数 C++ 中使用静态变量?的主要内容,如果未能解决你的问题,请参考以下文章

c++中静态成员变量和静态成员函数(笔试经历)

C++类和对象下

C++ 函数中静态变量的生命周期是多少?

C++ 函数中静态变量的生命周期是多少?

如何在 Typescript 中用静态变量表达构造函数?

第十二章 类和动态内存分配