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

Векторы (в классах) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 12:12     Векторы (в классах) #1
Всем здравствуйте.
Никак не разберусь с векторами, а именно:
Как заменить динамический массив на векторы?

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
class Dog
{
public:
        
    // int SetAge(int age) { _age = age; }
    // пока что нужно именно таким методом
    int Age;
};
 
void main()
{
    Dog* sharik = new Dog[4];
    Dog* bobik;
    bobik->Age = 3; // бобику 3 года
 
    for(int i = 0; i<4; ++i)
    {
         sharik[i].Age = bob.Age; // Всем Шарикам столько же лет 
         cout << "Sharik number: " << i << " is: " << sharik[i].Age << " year old\n";
    }
    
    delete []sharik, bobik;
    cin.get();
}
Вывод:
Sharik number: 0 is: 3 year old
Sharik number: 1 is: 3 year old
Sharik number: 2 is: 3 year old
Sharik number: 3 is: 3 year old

Добавлено через 3 часа 10 минут
Никто не знает?)
Dog* sharik = new Dog[4];
как это объявить векторным методом?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2011, 12:12     Векторы (в классах)
Посмотрите здесь:

C++ Наследование в классах
C++ Конструкторы в классах
программа в классах C++
Ошибки в классах C++
константы в классах C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
14.10.2011, 12:15     Векторы (в классах) #2
Код
vector<Dog*>MyDogVector;
MyDogVector.push_back(new Dog());
MyDogVector[MyDogVector.size()-1].Age = 3;
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 12:36  [ТС]     Векторы (в классах) #3
oxotnik, Спасибо. Но появилась другая проблема. Я не могу заполнить элементы массива.
C++
1
2
for(int i=0; i<4; ++i)
    MyDogVector.at(i)->Age = 3; // программа крешится
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
14.10.2011, 12:44     Векторы (в классах) #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void main()
{
    vector<Dog> sharik(4);
    Dog bobik;
    bobik.Age = 3; // бобику 3 года
 
    for(int i = 0; i<4; ++i)
    {
         sharik[i].Age = bobik.Age; // Всем Шарикам столько же лет 
         cout << "Sharik number: " << i << " is: " << sharik[i].Age << " year old\n";
    }
    cin.get();
}
aeshes
 Аватар для aeshes
437 / 200 / 13
Регистрация: 07.10.2011
Сообщений: 462
14.10.2011, 12:47     Векторы (в классах) #5
res, а как ты до этого вектор описал? Ты в него что-то положил, перед тем как пытаться к i-му элементу обратится?
Вот пример (шарики в векторе из объектов класса, бобики - в векторе из указателей на объекты)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    vector<Dog> sharik;
    for(int i = 0; i<4; ++i)
    {
        sharik.push_back(Dog());
        sharik.at(i).Age=3;
         cout << "Sharik number: " << i << " is: " << sharik[i].Age << " year old\n";
    }
 
    vector<Dog*> bobik;
    for(int i = 0; i<4; ++i)
    {
        bobik.push_back(new Dog());
        bobik.at(i)->Age=3;
         cout << "Bobik number: " << i << " is: " << bobik[i]->Age << " year old\n";
    }
ну или вектор надо сразу создавать нужного размера, как в предыдущем посте
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
14.10.2011, 12:48     Векторы (в классах) #6
Цитата Сообщение от res Посмотреть сообщение
delete []sharik, bobik;
Это неверно. delete следует вызывать отдельно для каждого из указателей:
C++
1
2
delete[] sharik;
delete bobik;
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 13:08  [ТС]     Векторы (в классах) #7
rangerx, "delete следует вызывать отдельно для каждого из указателей:"
Спасибо, это из-за того что первый delete - массив? Или для всех надо вызывать отдельно?

aeshes, Описание было постом выше, модера.


gooseim,

Не по теме:

Вот он, вот он! Вот он, вектор мой. Ребята вектор!!


Спасибо, ты все сделал так, как мне нужно было)
aeshes
14.10.2011, 13:28
  #8

Не по теме:

res, имела в виду, сделал ли ты четыре раза push_back() для вектора, перед тем как пытаться обратится к его i-му элементу? Или только один раз?

rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
14.10.2011, 13:34     Векторы (в классах) #9
res, для всех отдельно. Компилятор, кстати говоря, должен был выдать предупреждение на такую запись.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 13:53  [ТС]     Векторы (в классах) #10
rangerx, Спасибо. Viusal Studio 9 молчит.

aeshes, Не сделал, теперь понял в чём ошибка.

Теперь ещё один вопрос, как объявить вектор типа с конструктором?

C++
1
2
3
4
5
6
7
8
9
10
11
class Dog
{
public:
    Dog(float weight)  { weight = 1.5f; }
    ~Dog() {};
};
 
void main()
{
    vector <Dog(1.4f)> sharik(4); // ошибка
}
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
14.10.2011, 13:57     Векторы (в классах) #11
C++
1
vector <Dog> sharik(4, Dog(1.4f));
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
14.10.2011, 13:58     Векторы (в классах) #12
Цитата Сообщение от res Посмотреть сообщение
как объявить вектор типа с конструктором?
зачем?
Код
vector <Dog*>MyDogVector;
MyDogVector.push_back(new Dog(4));
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 14:05  [ТС]     Векторы (в классах) #13
gooseim,
Спасибо, я уже так пробовал, не получалось, видимо что то не верно сделал.
Работает.

oxotnik,
Все загвоздки хочу узнать, естественно это только примеры.
Твой метод отличается тем, что если выйдет за грань массива, программа не крешнит?
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
14.10.2011, 14:07     Векторы (в классах) #14
Цитата Сообщение от res Посмотреть сообщение
Твой метод отличаются тем, что если выйдет за грань массива, программа не крешнит?
за какую грань массива? вектор это "бесконечный" массив, push_back добавляет ему еще один элемент в конце. (на самом деле больше, но это внутренняя реализация)
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 14:20  [ТС]     Векторы (в классах) #15
Цитата Сообщение от oxotnik Посмотреть сообщение
за какую грань массива? вектор это "бесконечный" массив, push_back добавляет ему еще один элемент в конце. (на самом деле больше, но это внутренняя реализация)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Dog
{
public:
    Dog(float weight)  { weight = 1.5f; }
    ~Dog() {};
    int GetWight() const { return _weight; } 
    int Age;
private:
    int _weight;
};
 
void main()
{
    vector <Dog> pDog(4, Dog(1.3f));
    for(int i=0; i<5; ++i) // выходим за предел
    {
        pDog.at(i).Age = 14; // в пятом повторе креш
        cout << pDog.at(i).Age << endl;
    }
    cin.get();
}
такие дела
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
14.10.2011, 14:27     Векторы (в классах) #16

Не по теме:

Цитата Сообщение от res Посмотреть сообщение
такие дела
дааа.... таки дела... с дуру можно и писюн поломать


Код
void main() 
{
     vector <Dog> pDog(4, Dog(1.3f));
     for(int i=0; i< pDog.size(); ++i) // НЕ выходим за предел
     {
          pDog.at(i).Age = 14; // нету пятого повтора
          cout << pDog.at(i).Age << endl;
     }
     cin.get();
}
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 14:30  [ТС]     Векторы (в классах) #17
oxotnik, Извини, я тебя не пытался задеть.
ты потише братишка, вот в этой ситуаций.
а если не дай бог забуду поставить проверку на размерность?
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
14.10.2011, 14:32     Векторы (в классах) #18
Цитата Сообщение от res Посмотреть сообщение
а если не дай бог забуду поставить проверку на размерность?
ну максимум, что может получиться - большой ядерный взрыв (это если в той области работаешь), а так ну премии лишат, ну заказчик может за углом подкараулить... в общем не заморачивайся, ставь везде vector::size()
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
15.10.2011, 11:39  [ТС]     Векторы (в классах) #19
Цитата Сообщение от gooseim Посмотреть сообщение
C++
1
vector <Dog> sharik(4, Dog(1.4f));
А как объявить в динамических массивах?
C++
1
Dog *sharik = new Dog(1.4f)[4]...?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2011, 11:53     Векторы (в классах)
Еще ссылки по теме:

Подробнее о классах C++
C++ Ошибка в классах
C++ Fstream в классах

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

Или воспользуйтесь поиском по форуму:
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
15.10.2011, 11:53     Векторы (в классах) #20
res
C++
1
2
Dog **sharik = new Dog*[4];
sharik[0] = new Dog(1.4f);
Для нескольких
или
C++
1
Dog *sharik = new Dog(1.4f);
для одного
Yandex
Объявления
15.10.2011, 11:53     Векторы (в классах)
Ответ Создать тему
Опции темы

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