Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Jman
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 770
Завершенные тесты: 4
1

Vector в Классе

22.09.2016, 14:27. Просмотров 1528. Ответов 13
Метки нет (Все метки)

Добрый день. Не могу понять, как можно реализовать вектор в классе с конструктором. Просто в main все работает. Набросал код для класса, сделал в тупую через методы. Хотелось бы размер задавать через конструктор:
stdafx
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
 
using namespace std;
 
#define PI 3.14
#define SIZE 255
хеддер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once
class UserVectorTest
{
private: vector<int> myVector;
         int N;
         int size;
        
public:
    UserVectorTest();
    ~UserVectorTest();
    void PrintSourceVector(int N);
    void ResizeSourceVector(int size);
};
Класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
UserVectorTest::UserVectorTest()
{
    vector<int> myVector(0);
}
 
 
UserVectorTest::~UserVectorTest()
{
    myVector.clear();
}
 
void UserVectorTest::PrintSourceVector(int N)
{
    vector<int> myVector(N);
    cout << "\nНовый размер вектора равен: " << myVector.size();
    for (int i = 0; i < myVector.size(); i++)
    {
        myVector[i] = rand() % 20;
        cout << myVector[i] << " ";
    }
    cout << "\nРазмер вектора равен : " << myVector.size() << endl;
    
}
 
void UserVectorTest::ResizeSourceVector(int size)
{
    vector<int> myVector(size);
    int max = myVector[0];
    cout << "\nВектор с измененным размером: ";
    for (int i = 0; i < myVector.size(); i++)
    {
        myVector[i] = rand() % 20;
        cout << myVector[i] << " ";
        if (myVector[i]>max)
            max = myVector[i];
    }
    cout << "\nНовый размер вектора равен: " << myVector.size();
    cout << "\nМаксимальный элемент вектора равен: " << max << endl;
    myVector.clear();
 
}
Мэйн
C++
1
2
3
4
5
6
7
8
9
10
11
    int N, size;
            srand(time(NULL));
            cout << "Создать вектор. Изменяем его размерность до 10 элементов.\n"
                << "                 Ищем максимум. Очищяем                   \n\n";
            cout << "Задайте размер ->" << endl;
            cin >> N;
            UserVectorTest myVector;
            myVector.PrintSourceVector(N);
            cout << "Измените размер ->" << endl;
            cin >> size;
            myVector.ResizeSourceVector(size);
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2016, 14:27
Ответы с готовыми решениями:

Двумерный vector в классе
Добрый день. Возникла задача хранить в классе данные в двумерном vector. Причем, количество...

Как объявить vector в классе?
template&lt;typename NODETYPE&gt; class List { public: List(); ~List(); ... private:...

Std::vector/QVector в классе или std::vector/QVector классов?
Доброе время суток! Собственно вопрос в самой теме, есть некий класс class WorkJornal {...

Использование initializer_list<> в своём классе Vector
Привет. При разработке своего класса Vector возникла такая проблема: имеем такое определение...

Как правильно объявить vector в классе?
как правильно объявить вектор? #include &lt;vector&gt; #include &lt;algorithm&gt; using namespace std;...

13
stzer
116 / 90 / 56
Регистрация: 26.10.2013
Сообщений: 287
Завершенные тесты: 2
22.09.2016, 14:30 2
Извините за прямоту, но не надо лезть в STL, если плохо знаете основы языка.
0
Jman
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 770
Завершенные тесты: 4
22.09.2016, 14:33  [ТС] 3
Цитата Сообщение от stzer Посмотреть сообщение
Извините за прямоту, но не надо лезть в STL, если плохо знаете основы языка.
Я не прошу меня оценивать, я прошу указать на ошибку...
0
jurok_85
280 / 261 / 192
Регистрация: 21.02.2013
Сообщений: 624
Завершенные тесты: 1
22.09.2016, 14:57 4
Цитата Сообщение от Jman Посмотреть сообщение
Хотелось бы размер задавать через конструктор:
в хедере
C++
1
 UserVectorTest(int _size);
в .с файле
C++
1
2
3
4
5
UserVectorTest::UserVectorTest(int _size)
{
   size = _size;
    vector<int> myVector(size);
}
в мейне
C++
1
UserVectorTest vec(5);
0
22.09.2016, 14:57
DrOffset
10695 / 5716 / 1404
Регистрация: 30.01.2014
Сообщений: 9,165
22.09.2016, 15:05 5
Jman,
C++
1
2
3
4
5
6
7
8
// declaration:
UserVectorTest(size_t size);
 
 
// definition:
UserVectorTest::UserVectorTest(size_t size) 
    : myVector(size)
{ }
Отдельный size для вектора не нужен, он и так хранит свой размер.
0
Jman
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 770
Завершенные тесты: 4
22.09.2016, 15:18  [ТС] 6
Цитата Сообщение от DrOffset Посмотреть сообщение
Отдельный size для вектора не нужен, он и так хранит свой размер.
Да, видать по этому и не срабатывало =) А зачем тип данных t_size, чем плох тот же
C++
1
unsigned int(short)
?
0
DrOffset
10695 / 5716 / 1404
Регистрация: 30.01.2014
Сообщений: 9,165
22.09.2016, 15:22 7
Цитата Сообщение от Jman Посмотреть сообщение
указать на ошибку
Ошибка в том, что переменная вектора myVector внутри функции (в том числе конструктора) не имеет никакого отношения к переменной myVector класса - локальная переменная просто скрывает ее.
Также рекомендуется почитать про список инициализации конструктора и никогда (без крайней на то необходимости) в конструкторах присваивание не использовать.

Добавлено через 1 минуту
Цитата Сообщение от Jman Посмотреть сообщение
А зачем тип данных t_size, чем плох тот же
Плох тем, что это не memsize тип.

Цитата Сообщение от Jman Посмотреть сообщение
Да, видать по этому и не срабатывало =)
Не поэтому.
Почему - написал выше.
0
Jman
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 770
Завершенные тесты: 4
27.09.2016, 08:38  [ТС] 8
Снова всем привет. Добрался таки до этого примера. И снова у меня затык. При вызове функции члена в main через экземпляр у меня вектор равен нулю.
Функция член.
C++
1
2
3
4
5
6
7
8
9
10
11
12
void UserVectorTest::PrintSourceVector()
{
    //vector<int> myVector(N);
    cout << "\nНовый размер вектора равен: " << myVector.size();
    for (int i = 0; i < myVector.size(); i++)
    {
        myVector[i] = rand() % 20;
        cout << myVector[i] << " ";
    }
    cout << "\nРазмер вектора равен : " << myVector.size() << endl;
    
}
main
C++
1
2
3
4
cout << "Задайте размер ->" << endl;
            cin >> N;
            UserVectorTest myVector(N);
            myVector.PrintSourceVector();
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,492
27.09.2016, 09:19 9
Конструктор покажи.
0
Jman
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 770
Завершенные тесты: 4
27.09.2016, 09:22  [ТС] 10
header

C++
1
2
3
4
5
6
7
8
9
10
11
12
class UserVectorTest
{
private: vector<int> myVector;
         int N;
         int size;
        
public:
    UserVectorTest(int _size);
    ~UserVectorTest();
    void PrintSourceVector();
    void ResizeSourceVector(int size);
};
C#
1
2
3
4
5
UserVectorTest::UserVectorTest(int _size)
{
    size = _size;
    vector<int> myVector(size);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
UserVectorTest::~UserVectorTest()
{
    myVector.clear();
}
 
void UserVectorTest::PrintSourceVector()
{
    //vector<int> myVector(N);
    cout << "\nНовый размер вектора равен: " << myVector.size();
    for (int i = 0; i < myVector.size(); i++)
    {
        myVector[i] = rand() % 20;
        cout << myVector[i] << " ";
    }
    cout << "\nРазмер вектора равен : " << myVector.size() << endl;
    
}
C++
1
2
3
4
5
6
7
8
9
10
11
int N, size;
            srand(time(NULL));
            cout << "Создать вектор. Изменяем его размерность до 10 элементов.\n"
                << "                 Ищем максимум. Очищяем                   \n\n";
            cout << "Задайте размер ->" << endl;
            cin >> N;
            UserVectorTest myVector(N);
            myVector.PrintSourceVector();
            cout << "Измените размер ->" << endl;
            cin >> size;
            myVector.ResizeSourceVector(size);
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,492
27.09.2016, 09:25 11
Лучший ответ Сообщение было отмечено Jman как решение

Решение

Кривой конструктор у тебя. Ты просто локальный вектор создал. Вот так должно быть:
C++
1
2
3
4
5
UserVectorTest::UserVectorTest(int _size)
{
    size = _size;
    myVector.resize(size);
}
или даже так
C++
1
2
3
UserVectorTest::UserVectorTest(int _size): myVector(_size), size(_size)
{
}
Деструктор не нужен, он сам очистится.
0
Jman
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 770
Завершенные тесты: 4
27.09.2016, 09:48  [ТС] 12
Цитата Сообщение от nmcf Посмотреть сообщение
UserVectorTest::UserVectorTest(int _size): myVector(_size), size(_size)
Расшифруйте пожалуйста... что означает в этом конструкторе ":" - это же не наследование?
И почему не нужен деструктор для vector.clear? Он очистится по завершении исполнения программы?
0
nmcf
6532 / 5756 / 2621
Регистрация: 14.04.2014
Сообщений: 24,492
27.09.2016, 09:54 13
Цитата Сообщение от Jman Посмотреть сообщение
что означает в этом конструкторе ":"
Не наследование. Это такая форма инициализации полей класса через вызовы их конструкторов.
Цитата Сообщение от Jman Посмотреть сообщение
И почему не нужен деструктор для vector.clear?
У вектора есть свой деструктор, он сам себя очистит. Это лишнее действие.
0
Jman
87 / 75 / 38
Регистрация: 11.10.2015
Сообщений: 770
Завершенные тесты: 4
27.09.2016, 10:03  [ТС] 14
Спасибо. Теперь работает. Область видимости.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
class UserVectorTest
{
private: vector<int> myVector;
         int N;
         int size;
        
public:
    UserVectorTest(int _size);
    void PrintSourceVector();
    void ResizeSourceVector(int size);
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
UserVectorTest::UserVectorTest(int _size) : myVector(_size), size(_size)
{
}
 
void UserVectorTest::PrintSourceVector()
{
    for (int i = 0; i < myVector.size(); i++)
    {
        myVector[i] = rand() % 20;
        cout << myVector[i] << " ";
    }
    cout << "\nРазмер вектора равен : " << myVector.size() << endl;
    
}
 
void UserVectorTest::ResizeSourceVector(int size)
{
    myVector.resize(size);
    int max = myVector[0];
    cout << "\nВектор с измененным размером: ";
    for (int i = 0; i < myVector.size(); i++)
    {
        myVector[i] = rand() % 20;
        cout << myVector[i] << " ";
        if (myVector[i]>max)
            max = myVector[i];
    }
    cout << "\nНовый размер вектора равен: " << myVector.size();
    cout << "\nМаксимальный элемент вектора равен: " << max << endl;
    myVector.clear();
}
C++
1
2
3
4
5
6
7
8
9
10
11
int N, size;
            srand(time(NULL));
            cout << "Создать вектор. Изменяем его размерность до 10 элементов.\n"
                << "                 Ищем максимум. Очищяем                   \n\n";
            cout << "Задайте размер ->" << endl;
            cin >> N;
            UserVectorTest myVector(N);
            myVector.PrintSourceVector();
            cout << "Измените размер ->" << endl;
            cin >> size;
            myVector.ResizeSourceVector(size);
0
27.09.2016, 10:03
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2016, 10:03

Использование контейнера vector и перегрузка операций в классе
есть вот такое задание: Создать класс, в классе должны быть наборы конструкторов (в том числе по...

Непонятное поведение list, vector в другом классе
Салют. class _auxObserver { --- list&lt;gmObjBase*&gt; mObservedObj; vector&lt;int&gt; b; ...

Инициализация статического члена std::vector в шаблонном классе
есть класс myclass , владеющий классом struct template&lt;class T&gt; class myclass { struct...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru