Как использовать статическую переменную в конструкторе C ++? - PullRequest
0 голосов
/ 29 апреля 2018

У меня проблема, когда я использую статическую переменную в своем конструкторе классов. Мне нужно установить два значения, равные нулю, в первой строке инициализации в конструкторе, но я не хочу, чтобы они устанавливались в ноль после повторного вызова конструктора. Эти два значения будут увеличены. Поэтому, узнав о статических переменных, я попытался использовать статические переменные в своем конструкторе, но ошибки показали.

Итак, я хочу, чтобы значения 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

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Статические переменные не инициализируются в конструкторе, но могут быть изменены. Они инициализируются вне класса, например:

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

И в des / constructor вы можете их использовать:

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

IOMovement::~IOMovement(){
      vertPos--;
      horPos--;
}
0 голосов
/ 30 апреля 2018

На самом деле, когда вы разрабатываете класс, вы можете определить 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;
...

В конструкторе вы можете только инициализировать нестатические переменные-члены класса.

На этой странице объясняется лучше, как инициализируются static члены класса в c++:

Все статические данные инициализируются нулем, когда первый объект создается, если нет другой инициализации. Мы не можем положить это в определение класса, но оно может быть инициализировано вне класса повторное выделение статической переменной с использованием оператора разрешения области :: определить, к какому классу он принадлежит.

На этот ответ в переполнении стека приведен пример:

Они не могут быть инициализированы внутри класса, но могут быть инициализируется вне класса, в исходном файле:

// 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++ класса:

Статические члены класса C ++

C ++ инициализировать статические переменные в классе?

Конструкторы (C ++)

0 голосов
/ 29 апреля 2018

Вам не нужен статический заряд для этого варианта использования. Когда вы создаете объект, обычно вы вызываете конструктор только один раз.

Итак, если вы не объявляете их как статические и используете конструктор для их инициализации следующим образом: IOMovement::IOMovement() : vertPos(0), horPos(0) {//Your constructor logic. }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...