2014-04-08 2 views
1

Я работаю над большим заданием - вымышленной базой данных интернет-банкинга. Все это okayish, только он должен быть в состоянии ответить на вызов, как это:Object.MemberFunction (аргумент) .MemberFunction(); - Я просто не получаю это

bank.Account("123456").Balance(); 

банк является экземпляром класса банка, который содержит массив (да, мне запрещено использовать большую часть STL) из объекты класса Account.

Мысли: мне нужна функция Учетная запись & Учетная запись (const char *) в классе Банк, которая будет функцией друга для учетной записи класса, а затем можно вызвать функцию баланса, объявленную в классе Учетная запись. Я делаю это правильно? Я не прошу вас написать код для меня, я только хочу знать, буду ли я возглавлять в правильном направлении. Благодарю.

ответ

1

Да, это правильное направление. Ваш класс Bank необходим открытый метод

Account& Account (const char*); 

И ваш класс Account нуждается в публичную функцию

int Balance(); 

На самом деле вам не нужно «друг» для того, чтобы получить доступ к методам, они просто должны быть открытыми ,

Будьте осторожны с вашим методом учетной записи. Если вы введете имя учетной записи, которой не существует, что вы вернете? Возможно, вы должны вернуть в этом случае пустой объект Account (должен быть членом вашего класса Bank). В этом случае вы должны проверить свой возвращенный объект учетной записи, если он действителен до вызова Balance().

1

Псевдо-код в заголовке должен быть object.MemberFunction1(arguments).MemberFunction2(). И все в порядке, все будет хорошо.

Если MemberFunction1 возвращает объект или ссылку на объект, вы можете затем наложить больше вызовов на возвращаемый объект (или ссылку). И классы не должны быть друзьями, если они не пытаются получить доступ и непубличные члены.

В самом деле, если возвращаемый объект содержит метод, который, в свою очередь, возвращаемый объект, то вы могли бы

object.MemberFunction1(arguments).MemberFunction2().MemberFunction3(); 

И так далее, и так далее.

+0

Yay, это круто! Не знал об этом. Мне действительно нужно получить доступ к частным членам - идентификаторам учетной записи, поэтому именно поэтому. Или я мог бы использовать геттер - я не совсем уверен, в чем разница, только я чувствую, что -etters ленивы. – Lea

+0

@ LeaPetrášová Если вы * нужны * частным членам, вам следует, вероятно, пересмотреть свой дизайн. В худшем случае вы добавляете функцию getter/setter (функции, которые только получают или устанавливают эти частные переменные), в лучшем случае вы перепроектируете классы, чтобы свести к минимуму этот доступ. –

2

мне нужно функция счета & счета (Const символ *) в классе банке, который был бы друг функцией для класса счета и затем можно вызвать функцию баланса, объявленная в классе Account. Правильно ли я это делаю?

Вам не нужны никакие friend класс или функцию, просто сделать добытчиками public:

class Bank { 
public: 
    Account & Account (const char *); 
}; 

class Account { 
public: 
    Balance& Balance(); 
}; 
+0

сделал это и решил много, только теперь у меня возникла проблема, когда функция Account борется с конструктором Account. Ах. Много работы впереди меня. – Lea

+0

@ LeaPetrášová Обычный способ обработки несуществующей учетной записи (для строки не найден). У вас также может быть фиктивный член класса 'Account' в вашем классе' Bank', который указывает на то, что он недействителен (например, имеет идентификатор -1) и возвращает ссылку на него в случае, если соответствующая учетная запись не найдена. –

Смежные вопросы