Страница 2 из 2
Re: Дружественные классы
Добавлено: 01 окт 2010, 23:00
Евгений Александрович
Попробовал написать метод. Почему же нет достуа к методу 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;
}
Re: Дружественные классы
Добавлено: 01 окт 2010, 23:41
Romeo
Компилить-то пробовал? Оно же не компилябельно
1. Ты неправильно откопировал объявление класса. Класса CAccountCount у нас нету, есть класс CAccount.
2. В цикле не вывел сообщение о том, что вводится i-й счёт. Вместо этого вывел i и зачем-то имя клиента. Поправь - иначе непонятно будет.
3. Вызов метода у i-того элемента массива должно выглядеть так: m_pAccounts
.InputData();
4. Деструктор не доделан. Не удалена память, выделенная под m_pAccounts.
Ещё нужно написать метод OutputData по подобию. Ждём кода 
Re: Дружественные классы
Добавлено: 02 окт 2010, 00:15
Евгений Александрович
Подкорректировал, но не понял пункт 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;
}
Re: Дружественные классы
Добавлено: 02 окт 2010, 02:41
Romeo
Про деструктор я опечатался, просто. Хотел написать, что ты не удалил 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();
}
Компилируй и проверяй работу

Re: Дружественные классы
Добавлено: 02 окт 2010, 15:21
Евгений Александрович
Добавил банк. Но как всгда не без ошибок. Почти заработало , а т.е. когда дело доходит до ввода размерности, код "дохнет". В чем моя ошибка?
Код: Выделить всё
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");
}
Re: Дружественные классы
Добавлено: 02 окт 2010, 22:14
Romeo
Под клиентов память выделил, а данные о клиентах не считал. Нужно в цикле пробежаться по ним и вызвать InputData у каждого элемента массива.
Re: Дружественные классы
Добавлено: 03 окт 2010, 00:16
Евгений Александрович
Все заработало! Ура!
CClient *m_pAccounts;
Тут для класса ССlient еще неправильно написал, но прочувствовал и теперь все ОК.
Есть еще вопросик: как можно проверять пошаговое(даже, построчное выполнение кода)? Т.е. проследить пошагово за ходом работы.
P.S. Все было так подробно и интересно разобрано. Вы ,как и всегда, на высоте.Огромное спасибо!
Re: Дружественные классы
Добавлено: 03 окт 2010, 01:05
Romeo
Пожалуйста
Для того, чтобы проверять работу программы пошагово, нужно использовать дебагер. Он есть в любой среде разбработки. Если скажешь какой средой пользуешься, то я скорее всего смогу подсказать даже клавиши для управления им.
Re: Дружественные классы
Добавлено: 03 окт 2010, 22:21
Евгений Александрович
Microsoft Visual Studio 2008