Я просто попытаюсь охватить некоторые существенные недоразумения, которые у вас есть в отношении C ++.Приведенный выше код не исправим, вам нужно начать заново.В частности, вам нужно научиться использовать векторы вместо массивов.Массивы имеют все виды причуд в C ++, которые затрудняют их использование, векторы проще.
1) Вы не можете объявлять массивы, если размер массива не равен постоянной времени компиляции ,Так что это недопустимо
char Screen[Size.x][Size.y];
, потому что Size.x
и Size.y
являются переменными.Это было бы хорошо
char Screen[100][100];
Если вам нужен массив переменного размера, метод должен использовать динамическое распределение .Простой способ сделать динамическое распределение - использовать класс std::vector
.Вот двумерный вектор char
в C ++
std::vector<std::vector<char>> Screen(Size.x, std::vector<char>(Size.y));
2) Вы не можете вернуть массив из функции, поэтому даже игнорируя точку 1, это недопустимо
char _Screen[screenSize.x][screenSize.y] = MainDisplay.InitializeScreen(screenSize,defaultIcon);
Опять же, обычный ответ на проблемы с массивами - использовать std::vector
, который можно вернуть из функции.
3) Вы не можете передать массив функции в C ++.Таким образом, хотя этот код допустим
void DisplayScreen(char Screen[100][100])
Screen
, но не является массивом в этом коде, он является указателем.Любая попытка объявить массив как параметр функции в C ++ вместо этого преобразуется в указатель.Это особенно смущает начинающих.Ответом на эту проблему является использование std::vector
вместо массивов.Векторы могут быть переданы в качестве параметров в функции.
4) Вы не можете использовать sizeof
, чтобы получить размер массива, на который указывает указатель.Так что этот код допустим, но не работает так, как вы ожидаете
for (int i = 0; i < sizeof(Screen) / sizeof(*Screen);i++)
Этот код будет работать, если Screen
был массивом, но, как объяснено в пункте 3, это не так, это указатель.Ответом на эту проблему является использование std::vector
вместо массивов, поскольку у векторов есть встроенный метод size
, который возвращает размер векторов, например:
for (int i = 0; i < Screen.size(); i++)
5) Наконец, вы объявили свой экран вв двух разных местах, в main
и в InitializeScreen
.Это разные экраны, что, вероятно, не то, что вы хотели.Глядя на ваш код, я могу догадаться, что правильное место для объявления вашего экрана на самом деле находится в классе отображения, поскольку кажется, что вы хотите, чтобы оба метода класса display
ссылались на один и тот же экран.Разработка классов - это еще один аспект программирования, с которым начинающим приходится бороться.
Короче говоря, вернитесь к своей книге и прочитайте главу о векторах или, по крайней мере, прочитайте соответствующий учебник по массивам и указателям, который объясняетмного ограничений использования массивов.