Дружественные классы

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Попробовал написать метод. Почему же нет достуа к методу InputDate( Ваш пункт
- для i-го элемента массива вызывать метод InputData

Код: Выделить всё

class CClient
{
public:
	CClient();
	~CClient();
	void InputData();
	void OutputData();
private:
	char *m_szName; //имя клиента
	CAccountCount *m_pAccounts; // счета данного клиента
	int m_nAccountCount; //кол-во счетов
};
CClient::CClient()
{
	m_nAccountCount=0;
}
void CClient::InputData()
{
	m_szName=new char[33];
	cout<<" input name:"<<endl;
	cin>>m_szName;
	cout<<" input amount of values:"<<endl;
	cin>>m_nAccountCount;
	m_pAccounts=new CAccountCount[m_nAccountCount];
	for(int i=0;i<m_nAccountCount;i++)
	{
	 cout<<i<<" "<<m_szName<<endl;
	 m_pAccounts[i].
	}
}
CClient::~CClient()
{
Delete []m_pAccounts;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Компилить-то пробовал? Оно же не компилябельно :)

1. Ты неправильно откопировал объявление класса. Класса CAccountCount у нас нету, есть класс CAccount.
2. В цикле не вывел сообщение о том, что вводится i-й счёт. Вместо этого вывел i и зачем-то имя клиента. Поправь - иначе непонятно будет.
3. Вызов метода у i-того элемента массива должно выглядеть так: m_pAccounts.InputData();
4. Деструктор не доделан. Не удалена память, выделенная под m_pAccounts.

Ещё нужно написать метод OutputData по подобию. Ждём кода :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Подкорректировал, но не понял пункт 4:
Деструктор не доделан. Не удалена память, выделенная под m_pAccounts
Я не правильно удаляю m_pAccount ?

Код: Выделить всё

class CClient
{
public:
	CClient();
	~CClient();
	void InputData();
	void OutputData();
private:
	char *m_szName; 
	CClient *m_pAccounts; 
	int m_nAccountCount; 
};
CClient::CClient()
{
	m_nAccountCount=0;
}
void CClient::InputData()
{
	m_szName=new char[33];
	cout<<" input name:"<<endl;
	cin>>m_szName;
	cout<<" input amount of values:"<<endl;
	cin>>m_nAccountCount;
	m_pAccounts=new CClient[m_nAccountCount];
	for(int i=0;i<m_nAccountCount;i++)
	{
		cout<<"enter["<<i<<"]account:"<<endl;
	 m_pAccounts[i].InputData();
	}
}
void CClient::OutputData()
{
	cout<<m_szName<<endl;
	for(int i=0;i<m_nAccountCount;i++)
	{
		m_pAccounts[i].OutputData();
	}
}
	CClient::~CClient()
{
	delete []m_pAccounts;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Про деструктор я опечатался, просто. Хотел написать, что ты не удалил m_szName, а написал про другой указатель.

В OutputData желательно выписать что есть что, а не просто вывести данные (см. пример в классе CAccount).

Ещё ты забыл занулить поинтеры в конструкторе. Вообще конструктор должен вот так выглядеть примерно:

Код: Выделить всё

CClient::CClient() :
    m_szName(NULL), m_pAccounts(NULL), m_nAccountCount(0)
{}
Хорошо, теперь остался класс CBank. В нём, по подобию с CClient, нужно сделать выделение памяти и ввод данных для его полей в методе InputData, и вывод данных в OutputData. Ну и последний кусок кода, который тебе тоже понадобится, я пишу сам:

Код: Выделить всё

void main()
{
   CBank bank;

   cout << "--- Reading bank information ---" << endl;
   bank.InputData();

   cout << "--- Printing bank information ---" << endl;
   bank.OutputData();
}
Компилируй и проверяй работу :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Добавил банк. Но как всгда не без ошибок. Почти заработало , а т.е. когда дело доходит до ввода размерности, код "дохнет". В чем моя ошибка?

Код: Выделить всё

class CAccount
{
public:
	CAccount();
	~CAccount();
	void InputData();
	void OutputData();
private:
	int m_nID;
	int m_nValue;
};
CAccount::CAccount():m_nID(-1),m_nValue(-1){}
CAccount::~CAccount(){}
void CAccount::InputData()
{
	cout<<" Enter account ID:";
	cin>>m_nID;
	cout<<" Enter account value:";
	cin>>m_nValue;
}
void CAccount::OutputData()
{
	cout<<" account ID:" << m_nID <<" , Account Value: "<<m_nValue << endl;
}
class CClient
{
public:
	CClient();
	~CClient();
	void InputData();
	void OutputData();
private:
	char *m_szName; //имя клиента
	CClient *m_pAccounts; // счета данного клиента
	int m_nAccountCount; //кол-во счетов
};
CClient::CClient()
{
	m_nAccountCount=0;
	m_pAccounts=NULL;
	m_szName=NULL;
}
void CClient::InputData()
{
	m_szName=new char[33];
	cout<<" input name:"<<endl;
	cin>>m_szName;
	cout<<" input amount of values:"<<endl;
	cin>>m_nAccountCount;
	m_pAccounts=new CClient[m_nAccountCount];
	for(int i=0;i<m_nAccountCount;i++)
	{
		cout<<"enter["<<i<<"]account:"<<endl;
	 m_pAccounts[i].InputData();
	}
}
void CClient::OutputData()
{
	cout<<" name: "<<m_szName<<endl;
	cout<<" accounts:"<<endl;
	for(int i=0;i<m_nAccountCount;i++)
	{
	m_pAccounts[i].OutputData();
	}
}
	CClient::~CClient()
{
	delete []m_pAccounts;
	delete []m_szName;
}
class CBank
{
public:
	CBank();
	~CBank();
	void InputData();
	void OutputData();
private:
	char *szName;
	CClient *m_pClients;
	int m_nClientCount;
};
CBank::CBank()
{
	szName=NULL;
	m_pClients=NULL;
	m_nClientCount=0;
}
void CBank::InputData()
{
	szName=new char [33];
	cout<<" input bank name:"<<endl;
	cin>>szName;

	cout<<" sizeof:"<<endl;
	cin>>m_nClientCount;
	m_pClients=new CClient[m_nClientCount];
}
void CBank::OutputData()
{
	cout<<"bank name: "<<szName<<endl;
	for(int i=0;i<m_nClientCount;i++)
	{
		m_pClients[i].OutputData();
	}
}
CBank::~CBank()
{
	delete []m_pClients;
	delete []szName;
}
void main()
{
	CBank bank;
	cout<<"---Reading bank information---"<<endl;
	bank.InputData();
	cout<<"---Reading bank information---"<<endl;
	bank.OutputData();
	system("PAUSE");
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Под клиентов память выделил, а данные о клиентах не считал. Нужно в цикле пробежаться по ним и вызвать InputData у каждого элемента массива.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Все заработало! Ура!
CClient *m_pAccounts;
Тут для класса ССlient еще неправильно написал, но прочувствовал и теперь все ОК.

Есть еще вопросик: как можно проверять пошаговое(даже, построчное выполнение кода)? Т.е. проследить пошагово за ходом работы.

P.S. Все было так подробно и интересно разобрано. Вы ,как и всегда, на высоте.Огромное спасибо!
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Пожалуйста :)

Для того, чтобы проверять работу программы пошагово, нужно использовать дебагер. Он есть в любой среде разбработки. Если скажешь какой средой пользуешься, то я скорее всего смогу подсказать даже клавиши для управления им.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Евгений Александрович
Сообщения: 82
Зарегистрирован: 19 дек 2009, 16:48

Microsoft Visual Studio 2008
Ответить