Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 15:48     Vector и конструктор класса #1
Здравствуйте.

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

Я решил сделать класс и на него повесить контейнер 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);
}
Если так, причем тогда конструктор, который посоветовали мне ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4257 / 3688 / 1243
Регистрация: 14.04.2014
Сообщений: 14,445
06.05.2014, 16:10     Vector и конструктор класса #2
Либо не объявляй m_pFirst и m_pNext как указатели, сделай просто float, либо выделяй память через new для них при инициализации.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 16:32     Vector и конструктор класса #3
почитайте про ф-ции класса которые генерирует компилятор (навожу на мысль - push_back копирует экземпляр класса, а при копировании класса содержащего указатели конструктор копирования, сгенерированные компиляторм, может делать немного не то что Вы ждете от него)
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 16:32  [ТС]     Vector и конструктор класса #4
А в чем проблема с указателями?

либо выделяй память через new для них при инициализации.
А можно пример?

Так же надо будет потом произвести удаление ? delete[]
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 16:33     Vector и конструктор класса #5
Цитата Сообщение от pEntity Посмотреть сообщение
Так же надо будет потом произвести удаление ?
если выделяли под 1 переменную то delete, если выделяли под массив, то delete[]
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
06.05.2014, 16:35     Vector и конструктор класса #6
Цитата Сообщение от pEntity Посмотреть сообщение
Далее в самой функции изменяю данные переменных и создаю новую ячейку в контейнере:
это какой-то дикий бред. зачем метод класса обращается к какой-то глобальной переменной? Это неправильно и влечёт адскую путаницу!
Цитата Сообщение от pEntity Посмотреть сообщение
Потому как мой друг сказал, что это не верно, сказал создать конструктор у CTest и писать примерно так:
правильно сказал.
Цитата Сообщение от pEntity Посмотреть сообщение
vTest.push_back( Calculate( pFloat, RANDOM_FLOAT( 1, 5 ) ) );
это трижды адский бред. Ты вообще знаешь, что такое функция?
Цитата Сообщение от pEntity Посмотреть сообщение
Если так, причем тогда конструктор, который посоветовали мне ?
а где тут во всём твоём коде хоть один конструктор? Не вижу никаких конструкторов!
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 16:35     Vector и конструктор класса #7
pEntity, Вы могли описать что Вам нужно без ваших наработок, а то из 1го поста не совсем понятно что Вы пытаетесь сделать
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 16:51  [ТС]     Vector и конструктор класса #8
Просто у меня есть так скажем ящик. Я его создаю часто. В ящик я кладу много всяких данных. Мне с каждым ящиком нужно работать, с данными с этих ящиков. Вот хотел создать класс с данными, то есть мой ящик, сколько в нем игрушек, и прочего. И записывать в контейнер вектор.

Записал:

В ящике 1:

одна собачка красного цвета.
одна кошечка розового цвета.

Сохранил в контейнере. Контейнер с индексом 0.

Создал еще один ящик.

В ящике 2:

одна собачка черного цвета.
одна кошечка коричневого цвета.

Сохранил в контейнере. Контейнер с индексом 1.

Ну а далее прохожусь по всему контейнеру for( int i = 0; i < ( int )vTest.size(); i++ )

И если нахожу свою кошечку допустим, получаю индекс ящичка.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 16:56     Vector и конструктор класса #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
int a,b
public:
A(int x, int y):a(x),b(y){}
}
int main()
{
std::vector<A> Storage;
Storage.push_back(A(5,6));
Storage.push_back(A(8,3));
}
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 17:05  [ТС]     Vector и конструктор класса #10
aLarman, а если у меня есть указатели ? int *a,b

Можно ли мне добавлять в класс стороннии функции, не для записи, а просто для работы с теми же "a,b" ?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 17:08     Vector и конструктор класса #11
а чего нет то
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 17:10  [ТС]     Vector и конструктор класса #12
Спасибо.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 17:13     Vector и конструктор класса #13
Цитата Сообщение от pEntity Посмотреть сообщение
а если у меня есть указатели ?
а с какой целью Вы их используете, давайте ближе к делу - наведем на решение
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 17:17  [ТС]     Vector и конструктор класса #14
Просто пишу под sdk Hile-Life Там свои типы данных. edict_t* например.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 17:18     Vector и конструктор класса #15
а ладно...
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 19:25  [ТС]     Vector и конструктор класса #16
aLarman, а как мне перезаписать значение b в ячейке 8 например? То есть сделал 8 записей, прошелся циклом по всему размеру и если допустим в какой-либо ячейке b == 8, перезаписать его на 6.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 19:46     Vector и конструктор класса #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)
{
//чтото изменяем
}
}
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 19:54  [ТС]     Vector и конструктор класса #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);


Наверно задачи разные, но я не понимаю, просто вижу схожий функционал, объясните пожалуйста.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.05.2014, 20:08     Vector и конструктор класса #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 вектора
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 20:22     Vector и конструктор класса
Еще ссылки по теме:

C++ Как выглядит конструктор и деструктор для vector ?
C++ Пример класса с конструктором и деструктором, создание экземпляра класса через конструктор с параметрами
Как корректно скопировать vector в vector внутри класса C++

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

Или воспользуйтесь поиском по форуму:
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
06.05.2014, 20:22  [ТС]     Vector и конструктор класса #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 )

Всё верно ?


То есть данный вариант равен варианту через конструктор ?
Yandex
Объявления
06.05.2014, 20:22     Vector и конструктор класса
Ответ Создать тему
Опции темы

Текущее время: 10:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru