Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425

Класс векторов и хранение данных

02.03.2020, 11:40. Показов 3179. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне нужен совет небольшой. У меня имеются некоторые .h файлы, где я рассчитывал рост людей. В int main использовал вектора. И теперь мне нужно создать класс с названием Vector, чтобы все характеристики людей вывести на экран.
Пытался сделать такую штуку, но ругается на класс. Что тут не так?
C++
1
2
3
4
5
6
7
//Vector.h
class Vector {
public:
    string name;
    int number;
    Vector() { }
};
C++
1
2
//Обьявление вектрора в функции int main()
vector<Vector > N_m;
C++
1
2
3
4
5
6
7
8
9
10
//запись в вектор в int main
for(int i = 0; i < n; ++i)
{
    Name_value nv;
    cout << "Enter the name" << '\n';
    cin >> nv.name;
    cout << "Enter the number" << '\n';
    cin >> nv.number;
    N_m.push_back(nv);
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.03.2020, 11:40
Ответы с готовыми решениями:

Создать класс для обработки векторов разность векторов норму векторов
Создать класс для обработки векторов разность векторов норму векторов

Создать класс векторов, реализующий сложения и вычитания векторов
Помогите найти ошибку, так как неправильно выводятся массивы, то скорее всего не получается сформировать массив. А задание:создать класс...

Написать класс, обеспечивающий хранение строковых данных, конкатенацию (сшивание строк) и поиск
Вобщем, задали лабу написать класс, обеспечивающий хранение строковых данных, конкатенацию (сшивание строк) и поиск. Все вроде просто,...

16
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
02.03.2020, 12:03
Точку с запятой забыли после конструктора в классе поставить.
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
02.03.2020, 12:09  [ТС]
Это я исправил уже, спасибо. Можно вопрос пожалуйста? Сейчас я скину часть кода из моего меню, и мне нужно как-то данные эти сохранить и потом вывести на экран отдельным кейсом в программе. Как понимаю, тут можно подставить:
C++
1
2
3
4
5
6
7
8
9
10
11
case 1:
        {
            std::vector<Body *> bodies;
            bodies.emplace_back(new Parallelepiped(2,5,6));
 
            for (auto* body : bodies)
                body->Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
 
            for (auto* body : bodies)
                delete body;
        }; break;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//подставляем это
Series ser; //объявление
    vector< Series> N_m;//объявление
//-------------------------------------------------
case 1:
        {
            std::vector<Body *> bodies;
            bodies.emplace_back(new Parallelepiped(2,5,6));
 
            for (auto* body : bodies)
                body->Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
N_m.push_back(ser); //ПОДСТАВИЛИ ДЛЯ СОХРАНЕНИЯ
            for (auto* body : bodies)
                delete body;
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
02.03.2020, 12:35
Pandaprogrammer, ни фига не понял, Series - это кто и чего хотите добиться этим N_m.push_back(ser)?
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
02.03.2020, 12:43  [ТС]
Упс, заместо Series должен быть Vector. В общем, я хочу данные сохранить в вектор и позже их вывести, как это сделать на основе моего кода?
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
02.03.2020, 13:20
Pandaprogrammer, один фиг не понимаю... зачем тут это?
C++
1
2
std::vector<Body *> bodies;
bodies.emplace_back(new Parallelepiped(2,5,6));
по case 1: вы объявлете вектор и добавляете в него новый параллелепипед, затем... короче так:
C++
1
2
3
4
5
6
7
8
9
10
11
std::vector<Body> bodies;
swich (key)
{
 case 1:
  Body b = Parallelepiped(2,5,6);
  b.Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
  bodies.push_back(b);
  break;
 default:
  break;
}
Годиться?
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
02.03.2020, 13:44  [ТС]
Спасибо за подсказку, аннемески, я понял вашу задумку. А можно потом создать новый кейс и вывести данные, которые я записал о фигуре Parallelepiped?
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
02.03.2020, 13:53
Pandaprogrammer, можно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::vector<Body> bodies;
swich (key)
{
 case 1:
  Body b = Parallelepiped(2,5,6);
  b.Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
  bodies.push_back(b);
  break;
case 2:
 auto* it = bodies.begin();
 while(++it)
 {
  if (it->name == "Parallelepiped") // тут сами прикиньте как Вам идентифицировать фигуру которую хотите вывести
   b.Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
 }
  break;
 default:
  break;
}
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
02.03.2020, 14:05  [ТС]
Ругается на:
C++
1
 Body b = Parallelepiped(2,5,6);
а именно, на "b". Мне нужно её объявить? Body является абстрактным классом
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
02.03.2020, 14:23
Pandaprogrammer, нет, либо вместо абстрактного класса используйте производный, либо, если вам нужен доступ к разным типам производных объектов, его надо получать через указатель на базовый класс, как Вы это делали в посте №3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::vector<Body *> bodies;
swich (key)
{
 case 1:
  Body *b = new Parallelepiped(2,5,6);
  b->Print(std::cout) << ", S = " << body->SurfaceArea() << ", V = " << body->Volume() << std::endl;
  bodies.push_back(b);
  b = nullptr;
  break;
case 2:
 auto* it = bodies.begin();
 while(++it)
 {
  if ((*it)->name == "Parallelepiped") // тут сами прикиньте как Вам идентифицировать фигуру которую хотите вывести
   (*it)->Print(std::cout) << ", S = " << (*it)->SurfaceArea() << ", V = " << (*it)->Volume() << std::endl;
 }
  break;
 default:
  break;
}
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
02.03.2020, 15:02  [ТС]
Спасибо большое, вы мне очень помогли <3

Добавлено через 34 минуты
Он не хочет выводить объем и площадь так, в чем может быть проблема?
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
int main()
{
    setlocale(LC_ALL, "Russian");
    int e;
    do {
        system("pause");
        system("cls");
        cout << "[Protected By Airat]=> Введите номер выбора: " << endl;
        cout << "1. Найти объем и площадь прямоугольного параллелепипеда.  " << endl;
        cout << "2. Найти объем и площадь шара." << endl;
        cout << "3. Найти объем и площадь конуса." << endl;
        cout << "4. Вывести данные о фигурах." << endl;
        cout << "5. Выход из программы." << endl;
        cin >> e;       
        switch (e)
        {
        case 1:
        {
            std::vector<Body *> bodies;
            Body *b = new Parallelepiped(2, 5, 6);
 
            for (auto* b : bodies)
                b->Print(std::cout) << ", S = " << b->SurfaceArea() << ", V = " << b->Volume() << std::endl;
            bodies.push_back(b);
            b = nullptr;
            break;
            /*for (auto* body : bodies)
                delete body;*/
        }; break;
Добавлено через 2 минуты
полный мой код можно посмотреть тут:
Добавить класс Series(динамический массив), чтобы он записывал данные о фигуре
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
02.03.2020, 15:07
Pandaprogrammer, у Body должны быть виртуальные методы Print(), SurfaceArea() и Volume() переопределенные в Parallelepiped, если это уже есть нужно приводить указатель Body *b к типу указатель на Parallelepiped
C++
1
dynamic_cast<Parallelepiped *>(b)->Print(std::cout) << ", S = " << dynamic_cast<Parallelepiped *>(b)->SurfaceArea() << ", V = " << dynamic_cast<Parallelepiped *>(b)->Volume() << std::endl;
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
02.03.2020, 15:12  [ТС]
В Body всё это есть. Делал так, как сказали, но толку от этого, всё равно не выводит. Если же использовать код выше, который я скидывал в 3 посте - всё выводит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
//body.h
#pragma once
#include <iostream>
 
class Body
{
public:
    virtual ~Body() = default;
    virtual double SurfaceArea() const = 0;
    virtual double Volume() const = 0;
    virtual std::ostream& Print(std::ostream& out) const = 0;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Parallelepiped.h
#pragma once
#include "Body.h"
 
class Parallelepiped
    : public Body
{
public:
    Parallelepiped(double x, double y, double z);
    virtual double SurfaceArea() const override;
    virtual double Volume() const override;
    virtual std::ostream &Print(std::ostream &out) const;
 
public:
    double m_x;
    double m_y;
    double m_z;
};
Добавлено через 1 минуту
Подставил это - не выводит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
switch (e)
        {
        case 1:
        {
            std::vector<Body *> bodies;
            Body *b = new Parallelepiped(2, 5, 6);
 
            for (auto* b : bodies)
                dynamic_cast<Parallelepiped *>(b)->Print(std::cout) << ", S = " << dynamic_cast<Parallelepiped *>(b)->SurfaceArea() << ", V = " << dynamic_cast<Parallelepiped *>(b)->Volume() << std::endl;
            bodies.push_back(b);
            b = nullptr;
            break;
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
02.03.2020, 15:15
C++
1
2
3
4
double Parallelepiped::SurfaceArea() const
{
    return 2*(m_x + m_y + m_z);
}
Судя по названию этот метод должен считать площадь поверхности параллелепипеда, а он возвращает сумму длин его рёбер.

C++
1
2
3
4
double Parallelepiped::SurfaceArea() const
{
    return 2*(m_x * m_y + m_x * m_z + m_y * m_z); //площадь
}
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
02.03.2020, 15:19  [ТС]
Да, это не критично, я потом формулу исправлю. Мне главное понять, как сделать так, чтобы с помощью вектора выводились данные о фигуре с помощью кейса нового(У шара - радиус, у параллелепипеда и конуса, соответственно, другие параметры, которые указаны в .h файлах)

Добавлено через 1 минуту
То есть, нужно сделать в меню это:
C++
1
cout << "4. Вывести данные о фигурах." << endl;
И соответвенно, написать реализацию, чтобы выводило, к примеру: Ball: r=6. И это все в кейсе ниже, конечно. При этом должен использоваться класс Vector, который я создал. На этом я голову и сломал, второй день думаю, а остальное вроде просто.
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,690
02.03.2020, 16:07
Лучший ответ Сообщение было отмечено Pandaprogrammer как решение

Решение

Так будет работать.
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
std::vector<Body *> bodies;
auto it = bodies.begin();
Body *b;
int key = 0;
while (key > -1)
{
    cin >> key;
    switch (key)
    {
    case 1:
        b = new Parallelepiped(2, 5, 6);
        b->Print(cout) << ", S = " << b->SurfaceArea() << ", V = " << b->Volume() << endl;
        bodies.push_back(b);
        cout << "CASE1 bd.c= " << bodies.size() << endl;
        break;
    case 2:
        it = bodies.begin();
        cout << "CASE 2!!!" <<  endl;
        while (it != bodies.end())
        {
            (*it)->Print(std::cout) << ", S = " << (*it)->SurfaceArea() << ", V = " << (*it)->Volume() << std::endl;
                it++;
        }
        break;
    default:
        it = bodies.begin();
        while (while (it != bodies.end()))
        {
            delete *it;
            it++;
        }
        bodies.clear();
        break;
    }
}
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
02.03.2020, 16:25  [ТС]
27 строчка ругается
C++
1
 while (while (it != bodies.end()))
Добавлено через 2 минуты
U.P.D Исправил, убрал один while
C++
1
while(it != bodies.end())
Добавлено через 2 минуты
Cпасибо большое, пойду разбираться с кодом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.03.2020, 16:25
Помогаю со студенческими работами здесь

Хранение файлов и файловый менеджер в файле(листе) Excel, Бинарное хранение данных в CustomProperty листа Excel
Всем привет! Хочу поделится наработками, которые получились в процессе реализации своих задач. Отдельная благодарность! Андрей VG, за...

Класс многомерных векторов
inline avector::avector (unsigned N): dim(N){ cout&lt;&lt;&quot;pconstruct&quot;&lt;&lt;endl; a=new double ; if (a==NULL) {cout&lt;&lt;&quot;pizdecblya&quot;&lt;&lt;endl;...

Класс векторов на Dev-C++
Здравствуйте! Я учусь в университете, мы изучаем среду программирования Dev-C++ Ну и препод дал задание написать класс для векторов в...

Определить класс трехмерных векторов
Такое задание по ООП. Нужно определить класс трехмерных векторов. Для вектора, заданного двумя координатами, конструктор должен определять...

Определить класс векторов размерности n
Определить класс векторов размерности n. Создать конструкторы и деструктор.


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru