2016-03-18 2 views
-1

Это сводит меня вокруг поворота. Вся документация по векторам смехотворно глубока.Как объявить вектор досрочной длины в классе?

В классе я хочу объявить вектор, равный по длине, строке строки, которую я уже объявил. Это звучит достаточно просто.

Если я использую:

class Test { 
private: 
    size_t size = 10; 
    std::vector<int> array(size); 
}; 

я получаю «только статические константный интеграл элементы данных могут быть инициализированы в классе»

Если я:

std::vector<int> array(anarray.length()); 

Я получаю сказочно бесполезен :

ошибка C2061: синтаксическая ошибка: идентификатор 'anarray'

Как это сделать?

+0

Пожалуйста показать еще некоторый код, чтобы показать, что вы пытаетесь сделать. В частности, уточните «объявить вектор, равный по длине, строке строки, которую я уже объявил». –

+0

Пожалуйста, укажите полный код. Что такое 'unarray'? Также вам нужно указать, используете ли вы C++ 03 или C++ 11. – SergeyA

+0

Кроме того, 'array' является _bad_ именем для вашего члена векторного класса. –

ответ

-2

Просто избавитесь от (size). Вектор не имеет или должен иметь длину до тех пор, пока не будет существовать хотя бы один экземпляр. Число элементов в векторе не является частью его типа. A std::vector<int> не может содержать целых чисел или целых целых чисел - это все равно std::vector<int>. При объявлении того, что вектор является членом класса, число членов, которые будут иметь экземпляры этого вектора, позже, когда они существуют, не имеет значения.

+0

Спасибо, Дэвид, это полезно. Я всегда использовал C-массивы раньше, знаете ли вы о любых простых маршрутах в понимании векторов? Они кажутся намного сложнее! –

+0

@GeorginaDavenport - они отличаются от массивов C, но как только вы их поймаете, они на самом деле намного проще. –

+0

@GeorginaDavenport В принципе, 'std :: vector' - это контейнер для динамического массива переменной длины, который выделяет собственную память. Когда вы пытаетесь сохранить что-то в нем, он проверяет, есть ли у него место для хранения большего количества элементов. Если это произойдет, он просто сохранит его, как обычно. Если этого не произойдет, он автоматически выделит больше места. Сначала это может показаться немного сложным, но, как и многие другие, это будет иметь больший смысл, если у вас будет немного больше опыта с ним. –

0

Как это: (требуется C++ 11 или лучше)

class Test { 
private: 
    size_t size = 10; 
    std::vector<int> array = std::vector<int>(size); 
}; 
+0

Ричард, что метод подбрасывает больше ошибок, чем у меня уже есть: только статические константные интеграле элементы данных могут быть инициализированы в классе/ не является именем типа, статические или переписчик/ необъявленный идентификатор –

+0

не делайте этого таким образом. –

+0

Спасибо, я не буду. –

3

В классе инициализация требует использования type var = value; синтаксиса или единого синтаксис инициализации.

Для ваших нужд более целесообразно использовать синтаксис type var = value;.

class Test { 
    private: 
    std::size_t size = 10; 
    std::vector<int> array = std::vector<int>(size); 
}; 

Вы можете инициализировать size с помощью:

std::size_t size{10}; 

Однако, если вы используете

std::vector<int> array{size}; 

он будет пытаться создать std::vector с один элемент, содержащий значение size. Это не то, что вас интересует.

+0

'* Инициализация в классе требует использования синтаксиса типа var = value. *' Bullocks. Это не так. Унифицированная инициализация работает отлично. – SergeyA

+0

@SergeyA, спасибо за урок дня :) –

+0

Видимо , Я не могу этого сделать. Это читается как вырезание и вставка из другого места, и когда я пытаюсь это сделать, как говорится в OP, это не работает. Я получаю: только статические константные интегральные элементы данных могут быть инициализированы внутри класса/не являются именем типа, статическими или перечисляющими/незаявленными идентификаторами. Поэтому в лучшем случае оно должно быть неполным? –

0

Просто объявите std::vector<int> array, и если вы хотите, чтобы вектор не был больше одного определенного размера, создайте метод, который проверяет размер вектора перед вставкой.

1

Судя по битам и кускам, разбросанным по комментариям к различным ответам, я выяснил, что OP не использует C++ 11 и не нуждается в возможности динамического массива. Из-за этого, мой совет - пойти с хорошими статическими массивами в стиле C.После кода будет делать трюк:

struct Test { 
    static const size_t array_sz = 10; 
    int my_array[array_sz]; 
}; 

Если, по своей природе является присваивание от идиотской учителя CS, std::vector уполномочена, это то, как он должен быть инициализирован:

struct Test { 
    static const size_t array_sz = 10; 
    std::vector<int> my_array; 
    Test() : my_array(array_sz) {} 
}; 

Объяснение: std::vector должен быть построен с определенным аргументом, чтобы указать его размер. Pre-C++ 11 единственным способом вызова конкретного конструктора переменной-члена было сделать это в так называемом 0 инициализаторе конструктора окружающего класса.

После C++ 11 это также можно сделать непосредственно на сайте определения члена. Но для этого вам нужен компилятор, которому меньше 6 лет.

+0

Спасибо, Сергей, мы не были назначены в любом направлении. Правда, я не согласен с преподавателем по ряду технических вопросов, но это, кстати. Я начал с статического С, хотел сделать все правильно, и кажется, что я потерпел поражение от установки Университета. Спасибо, что прочитали, но это v.helpful. –

0

Члены данных обычно инициализируются в списке инициализации членов:

class Test 
{ 
    std::vector<int> array; 

public: 

    Test() : array(10) 
    {  // ^^^^^^^^^ 
    } 
}; 
Смежные вопросы