С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
#1

Vector и конструктор класса - C++

06.05.2014, 15:48. Просмотров 994. Ответов 28
Метки нет (Все метки)

Здравствуйте.

Задача создавать объекты с разными данными.

Я решил сделать класс и на него повесить контейнер Vector.

Ну допустим:

C++
1
2
3
4
5
6
7
8
9
class CTest
{
    public:
 
        float* m_pFirst;
        float* m_pNext;
 
        void Start( float* pFloat );
};
Создал сам контейнер и переменную для обращения к объектам класса.
C++
1
2
std::vector<CTest> vTest;
CTest Test;
Вызываю функцию: Test.Start( 2.0 );

Далее в самой функции изменяю данные переменных и создаю новую ячейку в контейнере:
C++
1
2
3
4
5
6
7
void CTest::Start( float* pFloat )
{
    m_pFirst = pFloat;
    m_pNext = RANDOM_FLOAT( 1, 5 );
 
    vTest.push_back( Test );
}
И так каждый раз при вызове: Test.Start( 2.0 );

У меня будет создаваться новый контейнер, который будет хранить свои данные переменных m_pFirst и m_pNext.

Мои знания слабы в С\С++, поэтому спрашиваю, что здесь не так или не совсем корректно? Потому как мой друг сказал, что это не верно, сказал создать конструктор у CTest и писать примерно так:

C++
1
2
3
vTest.push_back( CStart( 2.0, 3.0 ) );
// Или так:
CTest start; // CTest start(...); vSentryGuns.push_back(gun);
Я не понял, помогите пожалуйста разобраться и подсказать нормальный алгоритм.


Может проблема в том, что я кладу весь класс в контейнер? А нужно только переменные и нужно в классе создать функцию типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CTest
{
    public:
 
        float* m_pFirst;
        float* m_pNext;
        
        void Calculate( float *one, float *two )
        {
            m_pFirst = one;
            m_pNext = two;
        }
 
        void Start( float* pFloat );
};
А при вызове: Test.Start( 2.0 );

Делать так:
C++
1
2
3
4
void CTest::Start( float* pFloat )
{
    vTest.push_back( Calculate( pFloat, RANDOM_FLOAT( 1, 5 ) ) );
}
Или
C++
1
2
3
4
5
6
7
void CTest::Start( float* pFloat )
{
    CTest Test;
    Test.Calculate(pFloat, RANDOM_FLOAT( 1, 5 ));
 
    vTest.push_back(Test);
}
Если так, причем тогда конструктор, который посоветовали мне ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 15:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Vector и конструктор класса (C++):

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Как корректно скопировать vector в vector внутри класса - C++
Есть класс принимающий в конструкторе vector: class test { test(std::vector&lt;std::string&gt; codeList); ~test(); ...

Конструктор производного класса требует конструктор предка - C++
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...

Конструктор для vector - C++
привет всем ! к примеру класс, в котором под private находится объект например vector&lt;int&gt; R, как написать конструктор для таких объектов...

Реализовать класс Vector (конструктор, интерфейс) - C++
Добрый день. Нужна небольшая помощь (проверка) в редактировании (исправлении) кода. Задание - В файле исходного кода реализовать класс...

Vector не до конца понял Конструктор копирования - C++
Доброе утро, господа. У меня проблема, написал класс вектор, вроде все методы правильные, но проблема в том, что деструктор повторно...

28
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
06.05.2014, 19:25  [ТС] #16
aLarman, а как мне перезаписать значение b в ячейке 8 например? То есть сделал 8 записей, прошелся циклом по всему размеру и если допустим в какой-либо ячейке b == 8, перезаписать его на 6.
0
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
06.05.2014, 19:46 #17
у вектора есть оператор [] как в массиве, т.е Storage[7] (индексы начинаются с 0 поэтому 8ая позиция это элемент с индеком 7) или итератор
C++
1
2
3
4
5
6
7
for(std::vector<A>::iterator Iter = Storage.begin(); Iter != Storage.end(); Iter++)
{
if(что то там в векторе чему то там равно, в данном случае элемент это Iter)
{
//чтото изменяем
}
}
1
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
06.05.2014, 19:54  [ТС] #18
То есть так я смогу сделать?

C++
1
2
3
4
5
6
7
    for( int i = 0; i < ( int )Storage.size(); i++ )
    {
        if( Storage.at( i ).b == 3 )
        {
            Storage.at( i ).b = 5
        }
    }
И я видел, еще записывали данные без конструктора. Я так и не понял, когда нужно использовать конструктор для записи, а когда хватит и просто функции в классе. Можете объяснить ?

Я видел такой пример:

C++
1
2
3
4
5
6
7
8
class CA
{
public:
    Vector origin;
    Vector angles;
 
    void Calculate(Vector origin, Vector angles);
};
C++
1
2
3
4
5
void CA::Calculate(Vector _origin, Vector _angles)
{
    origin = _origin;
    angles = _angles;
}
И так записывали:

C++
1
std::vector<CA> vA;
*************************

C++
1
2
3
4
    CA a;
    a.Calculate( Vector( 25.0, 5.0, 10.0 ), Vector( 0.0, 65.0, 0.0 ) );
 
    vA.push_back(a);


Наверно задачи разные, но я не понимаю, просто вижу схожий функционал, объясните пожалуйста.
0
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
06.05.2014, 20:08 #19
Цитата Сообщение от pEntity Посмотреть сообщение
То есть так я смогу сделать?
at() лучше не использовать эта ф-цйия может бросить исключение
Цитата Сообщение от pEntity Посмотреть сообщение
И я видел, еще записывали данные без конструктора. Я так и не понял, когда нужно использовать конструктор для записи, а когда хватит и просто функции в классе. Можете объяснить ?
да смотрите можно сделать так
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
class A
{
public:
int x, y;
A(){}
}
int main()
{
std::vector<A> Storage;
A x;
for(int i = 0; i < 10;i++)//добавляем в вектор 10 элементов
{
Storage.push_back(x);
}
int i = 1;
int j = 0;
for(std::vector<A>::iterator Iter = Storage.begin(); Iter != Storage.end();Iter++)
{
Iter->x = i;//изменяем значение полей каждого элемента
Iter->y = j;
i++;
j+=2;
}
return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от pEntity Посмотреть сообщение
C++
1
2
3
4
5
void CA::Calculate(Vector _origin, Vector _angles) 
{
 origin = _origin; 
angles = _angles;
 }
тут ф-ция Calculate сетит(изменяет) значения внутренних переменных
Цитата Сообщение от pEntity Посмотреть сообщение
C++
1
2
3
CA a; 
a.Calculate( Vector( 25.0, 5.0, 10.0 ), Vector( 0.0, 65.0, 0.0 ) );
 vA.push_back(a);
а тут вызываем эту ф-цию, в качестве аргументов передаем только что сконструированные переменные Vector( 25.0, 5.0, 10.0 ) и Vector( 0.0, 65.0, 0.0 )
и следовательно после выполнения ф-ции Calculate переменные в экзапляре класса "а" будут изменены на эти 2 вектора
1
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
06.05.2014, 20:22  [ТС] #20
То есть тут

C++
1
2
3
A a; 
a.Calculate( Vector( 25.0, 5.0, 10.0 ), Vector( 0.0, 65.0, 0.0 ) );
 vA.push_back(a);
Создается первый элемент, в котором значения будут:

origin = Vector( 25.0, 5.0, 10.0 )
angles = Vector( 0.0, 65.0, 0.0 )

Если я еще раз сделаю уже так:

C++
1
2
3
A a; 
a.Calculate( Vector( 100.0, 500.0, 10.0 ), Vector( 5.0, 65.0, 80.0 ) );
 vA.push_back(a);
Создастся второй элемент, переменные которого будут:

origin = Vector( 100.0, 500.0, 10.0 )
angles = Vector( 5.0, 65.0, 80.0 )

И обратившись к первому я получу

origin = Vector( 25.0, 5.0, 10.0 )
angles = Vector( 0.0, 65.0, 0.0 )

А ко второму

origin = Vector( 100.0, 500.0, 10.0 )
angles = Vector( 5.0, 65.0, 80.0 )

Всё верно ?


То есть данный вариант равен варианту через конструктор ?
0
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
06.05.2014, 22:54 #21
Цитата Сообщение от pEntity Посмотреть сообщение
То есть данный вариант равен варианту через конструктор ?
да но работает медленнее
1
Kuzia domovenok
2060 / 1905 / 174
Регистрация: 25.03.2012
Сообщений: 6,557
Записей в блоге: 1
07.05.2014, 11:07 #22
Цитата Сообщение от aLarman Посмотреть сообщение
at() лучше не использовать эта ф-цйия может бросить исключение
LOL то есть вместо того, чтоб обработать исключение, по-твоему лучше уронить программу, выйдя за границы массива?!
0
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
07.05.2014, 11:09 #23
Kuzia domovenok, лучше проверить size чем ловить исключения, накладных расходов больше, и кто сказал что она вообще нужна? можно итератором по вектору пройти
0
Kuzia domovenok
2060 / 1905 / 174
Регистрация: 25.03.2012
Сообщений: 6,557
Записей в блоге: 1
07.05.2014, 12:06 #24
aLarman, тогда, если проверять на size тем более нет смысла боятся того, что
at() лучше не использовать эта ф-цйия может бросить исключение
Как же она его бросит, если ты всё проверил и точно знаешь, что обратился по корректному интексу?
0
aLarman
643 / 564 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
07.05.2014, 12:07 #25
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
точно знаешь, что обратился по корректному интексу?
а зачем тогда вообще ее использвать? если есть []
0
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
11.05.2014, 12:51  [ТС] #26
aLarman, я теперь не могу обратиться к методам класса.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CStart
{
        public:
 
                int m_iLevel;
                int m_iTeam;
 
                CStart( int iLevel, int iTeam ) : m_iLevel(iLevel), m_iTeam( iTeam ) { };
 
                void Spawn( );
 
};
 
CStart Start;
 
Start.Spawn( );
error: Нет подходящего конструктора по умолчанию.

Или мне нужен указатель? CStart* Start = new CStart( 0, 0 );


Так же вопрос, если я сделаю функцией ? Верна ли следующая работа ?

Класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
class CStart
{
        public:
 
                int m_iLevel;
                int m_iTeam;
 
                SetData( int iLevel, int iTeam ) : m_iLevel(iLevel), m_iTeam( iTeam ) { };
 
                void Spawn( );
 
};
Создаю объект класса, для доступа к свойствам и методам его:

C++
1
CStart Start;
Вызываю его функцию:

C++
1
Start.Spawn( );
В ней я меняю свойства переменных класса и создаю новый вектор:

C++
1
std::vector<CStart> vStart;
C++
1
2
3
4
5
6
7
8
9
void CStart::Spawn( )
{
    m_iLevel = 1;
    m_iTeam = 1;
 
    SentryGuns.SetData( m_iLevel,  m_iTeam  );
 
    vSentryGuns.push_back( SentryGuns );
}
Верно ли ? Думаю, что-то тут не так в vSentryGuns.push_back( SentryGuns );

Я ведь заношу целый экземпляр класса, как сказали выше, а это вроде не верно. Или всё же тут всё верно? И конструктор мне тут и не нужен в таком случае, так ?
0
Kuzia domovenok
2060 / 1905 / 174
Регистрация: 25.03.2012
Сообщений: 6,557
Записей в блоге: 1
11.05.2014, 13:20 #27
Цитата Сообщение от pEntity Посмотреть сообщение
error: Нет подходящего конструктора по умолчанию.
потому что ты не указал параметры при создании
C++
1
CStart Start( 0, 0 );
Цитата Сообщение от pEntity Посмотреть сообщение
Или мне нужен указатель? CStart* Start = new CStart( 0, 0 );
так тоже можно, но зачем? Если можно просто указать аргументы
C++
1
CStart Start( 0, 0 );
Цитата Сообщение от pEntity Посмотреть сообщение
void CStart::Spawn( )
{
* * m_iLevel = 1;
* * m_iTeam = 1;
SentryGuns.SetData( m_iLevel, *m_iTeam *);
vSentryGuns.push_back( SentryGuns );
}
и что это такое "SentryGuns"? я так подозреваю, вектор всех объектов CStart?
Так где он объявлен? Если в классе - то это бред, так нельзя. Ну... не нужно, по крайней мере.
Если вне класса, то почему эта функция "Spawn" является членом класса? Она не должна иметь никакого отношения к классу CStart!
Я, надеюсь, понятно объясняю?
1
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
11.05.2014, 13:52  [ТС] #28
Kuzia domovenok, да понятно. vSentryGuns.push_back( SentryGuns ); тут ошибочка

C++
1
2
3
4
5
6
7
void CStart::Spawn( )
{
       m_iLevel = 1;
       m_iTeam = 1;
       Start.SetData( m_iLevel, m_iTeam );
       vStart.push_back( Start );
}
Вот так всё.


Всё верно ?
0
pEntity
13 / 8 / 1
Регистрация: 12.12.2012
Сообщений: 442
15.05.2014, 19:16  [ТС] #29
Kuzia domovenok ?
0
15.05.2014, 19:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2014, 19:16
Привет! Вот еще темы с ответами:

Как выглядит конструктор и деструктор для vector ? - C++
Есть класс: class table_m { public: vector &lt;Item&gt; table; table_m(); }; Как будет выглядеть для него конструктор и...

Передача std::vector в конструктор[по ссылке\указателю ?] - C++
Доброго времени суток. Есть такой интерфейс класса: class HH_model_class { private: std::vector&lt;double&gt; parameters; ...

Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами - C++
Привести пример класса с конструктором и деструктором, созданием экземпляра класса с помощью конструктора с параметрами.

Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка - C++
Создать конструктор копий и оператор присваивания для класса компьютер и члена класса марка. Всем огромное спасибо за помощь! |


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

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

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