Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2010, 22:31   #1
bobby2008
Пользователь
 
Аватар для bobby2008
 
Регистрация: 13.04.2009
Сообщений: 37
По умолчанию Проблема с объектами С++

Здравствуйте, нужна ваша помощь. Самое простое задание - создать объект "товар" с полями "название" и "производитель". В общем вот что сделал я:
Код:
//

#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <string>

using namespace std;


class T_Product
{char* Name;
 char* Producer;
public:
    T_Product();
    T_Product(char*,char*);
    ~T_Product(){cout<<"Bye!";};
    void Show();
};

T_Product::T_Product()
{
    strcpy(Name,"");
    strcpy(Producer,"");
}
T_Product::T_Product(char* a,char* b)
{
    char* Name=new char;
    char* Product=new char;
    strcpy(Name,a);
    strcpy(Producer,b);
}

void T_Product::Show()
{
    cout<<"Name: "<<Name<<endl;
    cout<<"Producer: "<<Producer<<endl;
}

int main()
{
    char* a=new char;
    char* b=new char;
    cout<<"Input Name of the pruduct:"<<endl;
    cin>>a;
    cout<<"Input Producer of the product:"<<endl;
    cin>>b;
    cout<<a<<"\n"<<b;
    getch();
    T_Product tov1(a,b);
    tov1.Show();
    getch();
    return 0;
}
Вот что в результате получаю на строчке
Код:
Т_Product tov1(a,b);
Unhandled exception at 0x5bc0d337 (msvcr100d.dll) in Sasha.exe: 0xC0000005: Access violation writing location 0xcccccccc.

Что я неправильно сделал, подскажите, пожалуйста? Спасибо за ответы.
bobby2008 вне форума Ответить с цитированием
Старый 12.09.2010, 22:42   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

в конструкторе по умолчанию не выделяешь память. в конструкторе с параметрами и функции main выделяешь память для 1 символа, когда функция strcpy ожидает c-строку.

не используй в плюсах char без особой надобности. используй std::string

более менее правильный c++ код
Код:
#include <iostream>
#include <string>

using namespace std;

//-------------------------------------------------------------------------------------
class T_Product {
public:
    T_Product();
    T_Product(string &, string &);
	~T_Product();
	void Show();

private:
	string name;
	string producer;
};

//-------------------------------------------------------------------------------------
T_Product::T_Product()
	: name(""), producer("")
{}

//-------------------------------------------------------------------------------------
T_Product::T_Product(string &a, string &b)
	: name(a), producer(b)
{}

//-------------------------------------------------------------------------------------
T_Product::~T_Product()
{
	cout<<"Bye!";
}

//-------------------------------------------------------------------------------------
void T_Product::Show()
{
    cout << "Name: "<< name << endl;
    cout << "Producer: "<< producer << endl;
}

//-------------------------------------------------------------------------------------
int main()
{
    string a, b;
    cout << "Input Name of the pruduct:" << endl;
    cin >> a;
    cout << "Input Producer of the product:" << endl;
    cin >> b;
    T_Product tov1(a, b);
    tov1.Show();
    return 0;
}
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 12.09.2010 в 22:48.
pproger вне форума Ответить с цитированием
Старый 12.09.2010, 23:50   #3
bobby2008
Пользователь
 
Аватар для bobby2008
 
Регистрация: 13.04.2009
Сообщений: 37
По умолчанию

pproger, большое спасибо. Все работает. Но я не очень понимаю запись
Код:
T_Product::T_Product(string &a, string &b)
    : name(a), producer(b)
{}
Здесь наверное выделяется память для строки а и b и записывается туда значение, но можно это как-то написать через new и cin? Заранее спасибо за пояснения.
ЗЫ Извините за нубство, просто на лекции толком ничего не рассказали, а разобраться хочется.
bobby2008 вне форума Ответить с цитированием
Старый 13.09.2010, 05:10   #4
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
По умолчанию

a и b - это аргументы конструктора. В конструктор, по ссылке, передаются заранее созданные объекты string.

: name(a), producer(b) - данная запись, равносильна следующей записи:

Код:
T_Product::T_Product(string &a, string &b)
{
    name = a;
    producer = b;
}
То есть, это укороченная запись инициализации членов объекта.


Код:
string a, b;
cout << "Input Name of the pruduct:" << endl;
cin >> a;
cout << "Input Producer of the product:" << endl;
cin >> b;
Здесь считываются введённые строки из консоли и записываются в a и b.

Класс string сам отвечает за управление и выделение памяти, поэтому, тебе не нужно об этом беспокоится.
#include <мозг.h>
Руслантус вне форума Ответить с цитированием
Старый 13.09.2010, 15:58   #5
bobby2008
Пользователь
 
Аватар для bobby2008
 
Регистрация: 13.04.2009
Сообщений: 37
По умолчанию

Спасибо, все понял. Тему можно закрывать.
bobby2008 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с объектами dr.Chas Общие вопросы Delphi 1 25.05.2010 17:45
Работа с классами и объектами Shavminator Общие вопросы Delphi 7 18.12.2009 04:11
Работа с объектами NeXuLoN Помощь студентам 6 03.12.2009 07:45
задачка с объектами LyaLyaLya Помощь студентам 9 09.01.2009 02:02