Объявление двумерного вектора в шапке .h

132
24 июля 2019, 10:40

когда перемещаю в .h файл объявление вектора двумерного:

...
class PollutionZone : public QWidget
{
    Q_OBJECT
public:
    explicit PollutionZone(QWidget *parent = nullptr);
    ~PollutionZone();
    const int X_MAX = 500; // Размеры накладываемой сетки
    const int Y_MAX = 500;       
    std::vector <std::vector<bool>> MapWaterside(Y_MAX,  std::vector <bool>(X_MAX));
    ...
};

Появляется ошибка:C++ requires a type specifier for all declarations Ругается на Y_MAX.

Answer 1

Ругается на самом деле на

std::vector <std::vector<bool>> MapWaterside(Y_MAX,  std::vector <bool>(X_MAX));

Во-первых, в определении класса не допускается непосредственное применение ()-инициализаторов к членам класса. Допустимы только {} или = инициализаторы. В вашем случае можно поступить так

std::vector<std::vector<bool>> MapWaterside = std::vector(Y_MAX,  std::vector <bool>(X_MAX));

или так

const std::size_t X_MAX = 500;
const std::size_t Y_MAX = 500;       
std::vector <std::vector<bool>> MapWaterside = { Y_MAX, std::vector <bool>(X_MAX) };

(Обратите внимание, что тип int напрямую неприменим внутри {}-инициализатора для задания размера вектора, ибо получается сужающее преобразование.)

Во-вторых, не забывайте, что инициализатор для нестатического члена класса - это лишь "заготовка", которая физически будет использована только позже - в коде конструктора класса. Причем там у вас будет возможность "перекрыть" инициализаторы, указанные в определении класса. Это относится и к MapWaterside, и к X_MAX и Y_MAX тоже. Порядок инициализации, как всегда, соответствует порядку объявления. То есть если вы напишете в конструкторе

PollutionZone::PollutionZone(QWidget *parent) : Y_MAX(1000)
  {}

то Y_MAX получит значение 1000 и вектор будет проинициализирован для Y_MAX = 1000. Вы хотели достичь такого эффекта? Вам нужна такая возможность? Если нет, то возможно вам лучше подойдут

static constexpr int X_MAX = 500; // или `unsigned`, или `std::size_t`
static constexpr int Y_MAX = 500;     
READ ALSO
Ошибка при сборке драйвера MySql на Qt.

Ошибка при сборке драйвера MySql на Qt.

Все делаю по этой инструкции, но выходит ошибка qtsqldrivers-configpri: No such file or directoryЭтого файла у меня вообще нет на компьютере

155
CMake, add_subdirectory и наследование окружения

CMake, add_subdirectory и наследование окружения

Делаю проект с компиляцией под несколько платформ на c++Некоторые файлы нужно прогнать утилитой (для простоты понимания скажем, что это транспилятор)

148
Требуется подключить геймпад к плате Arduino Nano V3 (ATMega 168)

Требуется подключить геймпад к плате Arduino Nano V3 (ATMega 168)

Есть геймпад Aceline CG-1 на USB, который нужно подключить по Serial к Arduino NanoКак можно отслеживать нажатия кнопок (т

122