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

Классы. Баз данных о хранящихся на складе товарах - C++

Восстановить пароль Регистрация
 
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
17.04.2013, 22:16     Классы. Баз данных о хранящихся на складе товарах #1
В универе начинаем изучение с++, задали написать с помощью классов лабораторную. Программа должна из себя представлять что-то типа базы данных о хранящихся на складе товаров. У нас хранится название товара, его цена и кол-во в штуках. Вся база хранится в файле и записи можно добавлять/удалять/изменять.

Пока пытаюсь описать добавление новой записи. Вот что у меня получается:
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <res/goods.h>
#include <res/store.h>
using namespace std;
 
int main()
{
    int size, c;
    double p;
    char *n;
    cout << "Size:"; cin >> size;
    for(int i=0;i<size;i++)
    {
        cin.ignore();
        n = new char [255];
        cout << "Name:"; cin.getline(n,255);
        cout << "Price:"; cin >> p;
        cout << "Count:"; cin >> c;
        Store.add_good(n,p,c);
        delete [] n;
    }
}
goods.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef GOODS_H
#define GOODS_H
 
class Goods
{
private:
    char *name;
    double price;
    int count;
public:
    Goods(char *n, double p, int c);
    ~Goods();
};
 
#endif // GOODS_H
goods.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "goods.h"
#include <string.h>
using namespace std;
 
Goods::Goods(char *n, double p, int c)
{
    price=p;
    count=c;
    name = new char [strlen(n)+1];
    strcpy(name,n);
}
 
Goods::~Goods()
{
    delete [] name;
}
store.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef STORE_H
#define STORE_H
 
#include "goods.h"
#include <vector>
 
using namespace std;
 
class Store
{
private:
    vector <Goods> mass_store;
public:
    void add_good(char *n, double p, int c);
};
 
#endif // STORE_H
store.cpp:
C++
1
2
3
4
5
6
7
#include "store.h"
#include "goods.h"
using namespace std;
Store::add_good(char *n, double p, int c)
{
    mass_store.push_back(Goods(n,p,c));
}

Программа не компилируется и выдает следующие ошибки:
C++
1
2
../store/main.cpp: In function 'int main()':
../store/main.cpp:21:14: error: expected unqualified-id before '.' token
Что значит unqualified-id и почему он там expected?

P.S. Пишу в QTCreator под Debian, компилятор g++. Если это важно, конечно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Silvestr1994
 Аватар для Silvestr1994
27 / 27 / 1
Регистрация: 26.10.2012
Сообщений: 101
17.04.2013, 22:27     Классы. Баз данных о хранящихся на складе товарах #2
попробуйте почитать Р.Лафоре за классы там все понятно
Вложения
Тип файла: zip lafore_oop_v_cpp.zip (8.52 Мб, 15 просмотров)
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
18.04.2013, 05:54  [ТС]     Классы. Баз данных о хранящихся на складе товарах #3
Я правильно понял, что нужно в любом случае создавать объект класса и нельзя просто так вызвать функцию из класса?

Теперь main.cpp выглядит вот так:
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
#include <iostream>
#include <string>
#include <res/goods.h>
#include <res/store.h>
using namespace std;
 
int main()
{
    int size, c;
    double p;
    char *n;
    Store mass;
    cout << "Size:"; cin >> size;
    for(int i=0;i<size;i++)
    {
        cin.ignore();
        n = new char [255];
        cout << "Name:"; cin.getline(n,255);
        cout << "Price:"; cin >> p;
        cout << "Count:"; cin >> c;
        cout << n << " " << p << " " << c << endl;
        mass.add_good(n,p,c);
        delete [] n;
    }
}
Программа компилируется, но когда пытаюсь ввести какие-либо значения получаю следующий выхлоп консоли:

Код
*** glibc detected *** ./store: double free or corruption (fasttop): 0x08b8d148 ***
======= Backtrace: =========
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x70f01)[0xb7559f01]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(+0x72768)[0xb755b768]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(cfree+0x6d)[0xb755e81d]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0xb76dd4bf]
/lib/i386-linux-gnu/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xb74ffe46]
./store[0x8048f61]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:06 2222       /home/aspire/Dropbox/Projects/c++/store-build-desktop-Qt_4_8_2_in_PATH__System__Release/store
0804a000-0804b000 rw-p 00001000 08:06 2222       /home/aspire/Dropbox/Projects/c++/store-build-desktop-Qt_4_8_2_in_PATH__System__Release/store
08b8d000-08bae000 rw-p 00000000 00:00 0          [heap]
b7300000-b7321000 rw-p 00000000 00:00 0 
b7321000-b7400000 ---p 00000000 00:00 0 
b74e7000-b74e9000 rw-p 00000000 00:00 0 
b74e9000-b7645000 r-xp 00000000 08:01 130918     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b7645000-b7646000 ---p 0015c000 08:01 130918     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b7646000-b7648000 r--p 0015c000 08:01 130918     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b7648000-b7649000 rw-p 0015e000 08:01 130918     /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
b7649000-b764c000 rw-p 00000000 00:00 0 
b764c000-b7668000 r-xp 00000000 08:01 130825     /lib/i386-linux-gnu/libgcc_s.so.1
b7668000-b7669000 rw-p 0001b000 08:01 130825     /lib/i386-linux-gnu/libgcc_s.so.1
b7669000-b766a000 rw-p 00000000 00:00 0 
b766a000-b768e000 r-xp 00000000 08:01 130914     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b768e000-b768f000 r--p 00023000 08:01 130914     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b768f000-b7690000 rw-p 00024000 08:01 130914     /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
b7690000-b7770000 r-xp 00000000 08:01 4263       /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b7770000-b7774000 r--p 000e0000 08:01 4263       /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b7774000-b7775000 rw-p 000e4000 08:01 4263       /usr/lib/i386-linux-gnu/libstdc++.so.6.0.17
b7775000-b777c000 rw-p 00000000 00:00 0 
b778d000-b7791000 rw-p 00000000 00:00 0 
b7791000-b7792000 r-xp 00000000 00:00 0          [vdso]
b7792000-b77ae000 r-xp 00000000 08:01 137313     /lib/i386-linux-gnu/ld-2.13.so
b77ae000-b77af000 r--p 0001b000 08:01 137313     /lib/i386-linux-gnu/ld-2.13.so
b77af000-b77b0000 rw-p 0001c000 08:01 137313     /lib/i386-linux-gnu/ld-2.13.so
bf9c0000-bf9e1000 rw-p 00000000 00:00 0          [stack]
Аварийный останов
Что это значит?
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
18.04.2013, 06:26     Классы. Баз данных о хранящихся на складе товарах #4
Цитата Сообщение от iPet3o Посмотреть сообщение
Я правильно понял, что нужно в любом случае создавать объект класса
правильно
Класс это описание его физически не существует
а объект класса это уже физическая сущность, под него выделяется память, равная размеру класса

Добавлено через 10 минут
Цитата Сообщение от iPet3o Посмотреть сообщение
Программа компилируется, но когда пытаюсь ввести какие-либо значения получаю следующий выхлоп консоли:
у тебя нет конструктора копирования в Goods
в результате при копировании класса, который произойдет здесь
Цитата Сообщение от iPet3o Посмотреть сообщение
mass_store.push_back(Goods(n,p,c));
создается временный объект в нем выделяется память
Цитата Сообщение от iPet3o Посмотреть сообщение
name = new char [strlen(n)+1];
потом объект копируется (push_back) причем в объекте копии указатель на память равен указателю во временном объекте
потом разрушается временной объект в нем удаляется память
Цитата Сообщение от iPet3o Посмотреть сообщение
delete [] name;
а объект в стеке продолжает указывать на удаленную память
в результате при любом обращении ошибка
надеюсь, понятно объяснил?
Вывод:
Если работаешь с памятью, обязателен конструктор копирования
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
18.04.2013, 06:33  [ТС]     Классы. Баз данных о хранящихся на складе товарах #5
А может быть объект с таким же именем как класс?

Добавлено через 6 минут
Да, вполне понятно. Про конструктор копирования впервые слышу, если честно, пойду смотреть что за зверь такой.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
18.04.2013, 06:37     Классы. Баз данных о хранящихся на складе товарах #6
Цитата Сообщение от iPet3o Посмотреть сообщение
А может быть объект с таким же именем как класс?
а зачем ????
чтобы потом самому заплюхатся?
попытаюсь объяснить по другому
ты не можешь написать
C++
1
int =5;
потому что int это описатель
нужно писать так
C++
1
int A=5;
создать объект A типа int и присвоить ему значения
но никому не придет в голову писать так
C++
1
int int=5;
может и можно, а может нет( конфликт имен) мне как то этот вопрос в голову не приходил

Добавлено через 4 минуты
Цитата Сообщение от iPet3o Посмотреть сообщение
Про конструктор копирования впервые слышу, если честно, пойду смотреть что за зверь такой.
посмотри например здесь
http://www.c-cpp.ru/books/konstruktor-kopirovaniya
по моему понятно написано
или здесь
h t t p://ru.wikipedia.org/wiki/Конструктор_копирования
( пробелы убери а то форум ссылку режет)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.04.2013, 06:51     Классы. Баз данных о хранящихся на складе товарах #7
Цитата Сообщение от iPet3o Посмотреть сообщение
#include <iostream>
#include <string>
#include <res/goods.h>
#include <res/store.h>
using namespace std;
int main()
{
* * int size, c;
* * double p;
* * char *n;
* * cout << "Size:"; cin >> size;
* * for(int i=0;i<size;i++)
* * {
* * * * cin.ignore();
* * * * n = new char [255];
* * * * cout << "Name:"; cin.getline(n,255);
* * * * cout << "Price:"; cin >> p;
* * * * cout << "Count:"; cin >> c;
* * * * Store.add_good(n,p,c);
* * * * delete [] n;
* * }
}
Допустим. Но БД есть структурированное хранилище и при цифровой реализации эту структуру на всех этапах должен понимать комп. Как собираешься парсить это при загрузке? ИМХО проще бинарник.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
18.04.2013, 07:24     Классы. Баз данных о хранящихся на складе товарах #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Допустим. Но БД есть структурированное хранилище и при цифровой реализации эту структуру на всех этапах должен понимать комп. Как собираешься парсить это при загрузке? ИМХО проще бинарник.
будь проще,человек только начал изучать язык,и скорее всего половину того что ты написал , он не поймет, хотя могу ошибатся
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
19.04.2013, 10:32  [ТС]     Классы. Баз данных о хранящихся на складе товарах #9
Да я-то понимаю. До с++ у нас паскаль был. Я, собственно, и планировал потом это все дело в типизированном файле хранить, как это в паскале мы делали.

Добавлено через 4 минуты
Да и тот факт, что я уже лет 6 линуксом как основной системой пользуюсь, обязывает понимать подобные речи

Добавлено через 8 часов 7 минут
Так, вроде разобрался с конструктором копирования (по крайней мере ошибок ни при выполнении ни при компиляции не наблюдаю). Теперь у меня совсем глупый вопрос: как вывести мне значения, которые я храню в векторе?
команды типа mass_goods[i].name/price/count не работают...

Добавлено через 17 часов 23 минуты
Все, разобрался.

Тема закрыта.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2013, 11:15     Классы. Баз данных о хранящихся на складе товарах #10
Цитата Сообщение от Nixy Посмотреть сообщение
будь проще,человек только начал изучать язык,и скорее всего половину того что ты написал , он не поймет, хотя могу ошибатся
Это новичок, да. А в какой области? Он сам сказал, что в области разработки баз данных. Так вот, если он на столько новичок в языке, то ему рано за бд вообще браться, так как текстовая бд сложнее, а не проще.

Добавлено через 3 минуты
Цитата Сообщение от iPet3o Посмотреть сообщение
Я, собственно, и планировал потом это все дело в типизированном файле хранить, как это в паскале мы делали.
Нельзя, на плюсах разрешены только сырые бинарники, а формат фактически типизированного файла ложится на саму приладу, а не на язык.

Добавлено через 22 минуты
И разработчик собственной оси может быть новчиком в конкретной области, если эта ось у него первая.
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
19.04.2013, 12:24  [ТС]     Классы. Баз данных о хранящихся на складе товарах #11
Цитата Сообщение от taras atavin Посмотреть сообщение
Это новичок, да. А в какой области? Он сам сказал, что в области разработки баз данных. Так вот, если он на столько новичок в языке, то ему рано за бд вообще браться, так как текстовая бд сложнее, а не проще.
Я же не пишу какую-то коммерческую программу. Это просто лабораторная работа по работе с классами для первого курса факультета вычислительной математики и кибернетики. На примере этой лабораторной мы постигаем основы ООП и работы с классами.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2013, 16:07     Классы. Баз данных о хранящихся на складе товарах #12
Всё равно я бы делал для name pascal-строку с бинарной длиной, а остальное просто бинарными числами в ожидаемых местах. Этот поход отлично мирит строки с бинарником. А вот ты мне объясни, как ты собираешься разбирать все эти name:, price:, count: при загрузке из файла. Не комерческая? Эйси. Как раз учебная кривоподелуха на тему БД - отличный проект для новичка в области разработки БД, коммерческую пишут опытные коллеги.
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
19.04.2013, 16:33  [ТС]     Классы. Баз данных о хранящихся на складе товарах #13
Цитата Сообщение от taras atavin Посмотреть сообщение
А вот ты мне объясни, как ты собираешься разбирать все эти name:, price:, count: при загрузке из файла.
Нууу, до этого я еще не дошел А вобще я свято верю в то, что я смогу перегрузить операторы >> и << в классе и потом обращаться к файлу через поток fstream.

Да и вряд ли я обижусь если вы подробно распишите и подкретите ссылками типа "почитай вот тут" свой метод со строкой, опыта у вас явно больше, чем у меня, думаю, плохого не посоветуете.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
19.04.2013, 17:53     Классы. Баз данных о хранящихся на складе товарах #14
Цитата Сообщение от iPet3o Посмотреть сообщение
А вобще я свято верю в то, что я смогу перегрузить операторы >> и <<
перегрузить то не проблема
проблема придумать формат файла
в файле же полей нет доступ последовательный
как различишь где заканчивается
Цитата Сообщение от iPet3o Посмотреть сообщение
char *name;
на вскидку вижу два пути или
с динамической строкой сохранять в файле размер
как сказал
Цитата Сообщение от taras atavin Посмотреть сообщение
Всё равно я бы делал для name pascal-строку с бинарной длиной,
или строка фиксированной длинны
C++
1
char name[256];
можно придумать маркеры начала/конца записи
начала/конца поля и т.д.

Добавлено через 9 минут
для цены
Цитата Сообщение от iPet3o Посмотреть сообщение
double price;
негоже использовать double, ошибки округления и т.д.
лучше int(цена в копейках)
а еще лучше свой формат
например такую структуру
C++
1
2
3
4
5
struct _Price
{
int Rub;
int Cop;
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.04.2013, 18:02     Классы. Баз данных о хранящихся на складе товарах #15
Цитата Сообщение от ValeryS Посмотреть сообщение
можно придумать маркеры начала/конца записи
начала/конца поля и т.д.
Добавлено через 9 минут
для цены
Сообщение от iPet3o
double price;
негоже использовать double, ошибки округления и т.д.
лучше int(цена в копейках)
Ну если хватает инта в жалкие 32 бита, то в 64-х от дабла одна мантисса будет длинней. И вообще то я имел ввиду специализированный currency.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 18:10     Классы. Баз данных о хранящихся на складе товарах
Еще ссылки по теме:

C++ Написать программу для обработки данных о различных товарах
Изучаю с++ и OpenGl хочу начать параллельное изучение баз данных нужен совет C++
C++ Классы и типы данных

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

Или воспользуйтесь поиском по форуму:
iPet3o
0 / 0 / 0
Регистрация: 17.04.2013
Сообщений: 31
19.04.2013, 18:10  [ТС]     Классы. Баз данных о хранящихся на складе товарах #16
ValeryS, ну можно сделать совсем по-наркомански и хранить это все в текстовом файле и разделять поля каким-либо символом. При больших объемах данных, правда, будет медленно парсить. Очень медленно.

До файлов мне еще нужно с векторами разобраться. Когда я пытаюсь удалить запись через вот такую функцию
C++
1
2
3
4
void Store::del_good(int i)
{
    mass_store.erase(mass_store.begin()+i);
}
Мне в консоли опять выдается дамп памяти, а программа падает так и не удалив запись из вектора. Что за?
Yandex
Объявления
19.04.2013, 18:10     Классы. Баз данных о хранящихся на складе товарах
Ответ Создать тему
Опции темы

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