【问题标题】:How to use a static variable in a constructor c++?如何在构造函数 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

【问题讨论】:

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

标签: c++ windows visual-studio class object


【解决方案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++)

      【讨论】:

      • 对不起,没有。这是一个错误。
      猜你喜欢
      • 2021-07-06
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      相关资源
      最近更新 更多