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

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

Войти
Регистрация
Восстановить пароль
 
 
iPet3o
1 / 1 / 0
Регистрация: 17.04.2013
Сообщений: 32
#1

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

17.04.2013, 22:16. Просмотров 955. Ответов 15
Метки нет (Все метки)

В универе начинаем изучение с++, задали написать с помощью классов лабораторную. Программа должна из себя представлять что-то типа базы данных о хранящихся на складе товаров. У нас хранится название товара, его цена и кол-во в штуках. Вся база хранится в файле и записи можно добавлять/удалять/изменять.

Пока пытаюсь описать добавление новой записи. Вот что у меня получается:
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++. Если это важно, конечно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2013, 22:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Классы. Баз данных о хранящихся на складе товарах (C++):

Выдать информацию о товарах на аптечном складе - C++
В аптечном складе хранятся лекарства. Сведения о лекарствах содержаться в специальной ведомости: наименования лекарственного препарата;...

Вывести информацию о товарах, имеющихся на складе в количестве более ста и определить них суммарную стоимость - C++
Захватить память для массива из 10 структур задания 1(Сформировать структуру PRICE для хранения следующей информации: номенклатурный номер;...

Разработать программу:«Учет товаров на складе» используя классы - C++
Помогите пожалуйста с программой , которая должна состоять из классов. Коробки(объекты) в складе являются одномерным массивом. • Создать...

Запись данных,хранящихся в дереве - C++
Возникла задача сохранить данные,являющиеся узлами дерева.Первая мысль-рекурсивный вызов функции,сохраняющей данные для каждого из потомков...

Обработка данных, хранящихся в текстовом файле - C++
Дан текстовый файл f. Записать в перевернутом виде строки файла f в файл g. Порядок строк в файле g должен совпадать с порядком исходных...

Написать программу для обработки данных о различных товарах - C++
Помогите оч оч срочно!! Зачёт (если можно полностью программу) Написать программу для обработки данных о различных товарах. Каждый товар...

15
Silvestr1994
27 / 27 / 1
Регистрация: 26.10.2012
Сообщений: 101
17.04.2013, 22:27 #2
попробуйте почитать Р.Лафоре за классы там все понятно
1
Вложения
Тип файла: zip lafore_oop_v_cpp.zip (8.52 Мб, 16 просмотров)
iPet3o
1 / 1 / 0
Регистрация: 17.04.2013
Сообщений: 32
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]
Аварийный останов
Что это значит?
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
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;
а объект в стеке продолжает указывать на удаленную память
в результате при любом обращении ошибка
надеюсь, понятно объяснил?
Вывод:
Если работаешь с памятью, обязателен конструктор копирования
1
iPet3o
1 / 1 / 0
Регистрация: 17.04.2013
Сообщений: 32
18.04.2013, 06:33  [ТС] #5
А может быть объект с таким же именем как класс?

Добавлено через 6 минут
Да, вполне понятно. Про конструктор копирования впервые слышу, если честно, пойду смотреть что за зверь такой.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
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/Конструктор_копирования
( пробелы убери а то форум ссылку режет)
0
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;
* * }
}
Допустим. Но БД есть структурированное хранилище и при цифровой реализации эту структуру на всех этапах должен понимать комп. Как собираешься парсить это при загрузке? ИМХО проще бинарник.
1
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
18.04.2013, 07:24 #8
Цитата Сообщение от taras atavin Посмотреть сообщение
Допустим. Но БД есть структурированное хранилище и при цифровой реализации эту структуру на всех этапах должен понимать комп. Как собираешься парсить это при загрузке? ИМХО проще бинарник.
будь проще,человек только начал изучать язык,и скорее всего половину того что ты написал , он не поймет, хотя могу ошибатся
0
iPet3o
1 / 1 / 0
Регистрация: 17.04.2013
Сообщений: 32
19.04.2013, 10:32  [ТС] #9
Да я-то понимаю. До с++ у нас паскаль был. Я, собственно, и планировал потом это все дело в типизированном файле хранить, как это в паскале мы делали.

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

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

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

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

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

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

Да и вряд ли я обижусь если вы подробно распишите и подкретите ссылками типа "почитай вот тут" свой метод со строкой, опыта у вас явно больше, чем у меня, думаю, плохого не посоветуете.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,918
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;
}
0
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.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 18:02
Привет! Вот еще темы с ответами:

Изу примеры баз данных для консоли - C++
помогите с примерами баз данных по си++ в консоли...

Составить программу формирования данных о товарах на складе - C#
Склад. Составить программу формирования данных о товарах на складе: номер по порядку, наименование товара, цена, количество единиц товара....

Составить программу формирования данных о товарах на складе - Pascal ABC
Склад.Составить программу формирования данных о товарах на складе: номер по порядку наименование товара,цена,количество единиц...

База товаров, хранящихся на складе - Delphi БД
База товаров, хранящихся на складе: наименование, единица измерения, цена единицы, количество, дата последнего завоза. Регистрация...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
19.04.2013, 18:02
Ответ Создать тему
Опции темы

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