Как инициализировать вектор определенной длины в классе? - PullRequest
0 голосов
/ 03 мая 2018

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

class MyClass
{
private:
std::vector<int> m_ray_fbos(5);
}

Это дает мне предупреждение (в Visual Studio 2017) expected a typed identifier

Я тоже пробовал std::vector<int> m_ray_fbos(5, 0);

Единственная мысль, которую я могу получить, - это std::vector<int> m_ray_fbos = { 0, 0, 0, 0, 0 };, но, очевидно, это не идеально для длинных векторов.

Я что-то не так делаю?

Есть ли способ указать размер вектора в определении класса?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Стиль инициализатора () в скобках не разрешен синтаксисом для члена в определении класса. (Я не совсем уверен, почему.) Единственными допустимыми формами инициализатора для членов в определении класса являются {} фигурный инициализатор-список или инициализатор, который начинается с =.

И это мешает вам, так как:

std::vector<int> m_ray_fbos{5};

или

std::vector<int> m_ray_fbos = {5};

вызовите неправильный vector конструктор и не дайте желаемых результатов. И

std::vector<int> m_ray_fbos = 5;

не будет работать, потому что вам нужен конструктор explicit, а символ = инициализирует эту копию, поэтому конструкторы explicit не рассматриваются.

Самый простой ответ, вероятно,

std::vector<int> m_ray_fbos = std::vector<int>(5);

Возможно, вы также можете сделать что-то вроде

std::vector<int> m_ray_fbos = vec_of_size(5);

если у вас было достаточно других причин, чтобы написать или использовать функцию класса vec_of_size или свободную функцию.

0 голосов
/ 03 мая 2018

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

#include <iostream>
#include <vector>

class MyClass
{
    std::vector<int> m_ray_fbos;
public:

    MyClass() : m_ray_fbos(5) {}
    size_t GetSize() const
    {
        return m_ray_fbos.size();
    }
};

int main()
{
    MyClass c;
    std::cout << c.GetSize() << std::endl;

    return 0;
}

https://ideone.com/QTOs7l

5

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