Известный размер массива / указателя в качестве аргумента - PullRequest
0 голосов
/ 17 января 2020
InputManager* input = new InputManager(new int[]{ SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT });

Я хочу передать этот массив ключей (или указатель на него), но мне нужен конструктор InputManager, чтобы узнать его размер. Поскольку он известен во время компиляции, как я могу его получить?

В сети я нашел этот шаблон

template <int N>
InputManager::InputManager(int (&keyArray)[N]) {
    this->maxKeys = N;
    this->keys = keyArray;
}

Но я получаю ошибку, что аргументы не совпадают.

I нужно любое возможное решение, где мне не нужно вручную писать длину. Так что макросы, шаблоны или что-то еще принимаются.

Ответы [ 2 ]

1 голос
/ 17 января 2020

Не используйте так много указателей. Это вредно для здоровья, и вы, вероятно, либо потеряете память, либо попытаетесь освободить память, которую вы не можете (если вы не передали недавно выделенный массив). Вот минимальная модификация вашего кода:

class InputManager {
public:
    template <int N>
    InputManager(int (&keyArray)[N]) 
        : maxKeys(N), keys(std::make_unique<int[]>(N))
    {
        std::copy_n(keyArray, N, keys.get());
    }

private:
    std::size_t maxKeys;
    std::unique_ptr<int[]> keys;
};

int main() {
    int keys[] = { 1, 5, 4, 7, 2 };
    InputManager input {keys};
}

Этот компилирует (GodBolt).

Примечания:

  • Таким образом, вы не нужно писать собственный деструктор; хотя вам нужно написать оператор присваивания, который копирует данные; и конструктор копирования.
  • Вероятно, лучше просто использовать std::vector для внутреннего использования (или std::array, если вы заранее знаете размер ввода) и использовать любой диапазон или диапазон клавиш в конструкторе.
0 голосов
/ 17 января 2020

Обернуть создание этого массива в функцию с помощью шаблона * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *; массив, который вы можете вернуть pair:

template<class ... enums>
std::pair< int*, size_t > makeArray2(enums ... e) {
    constexpr size_t N = sizeof...(e);
    return std::make_pair( new int[N]{e...}, N);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...