如何在构造函数 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++ 中使用静态变量?的主要内容,如果未能解决你的问题,请参考以下文章