2014-01-14 3 views
0

Мне было интересно, есть ли у вас члены класса на C++ с теми же аргументами, если есть способ упростить это? Например:Те же аргументы в членах класса: Упростить?

#include <iostream> 
using namespace std: 

class bankAccount 
{ 
public: 
     bankAccount() 
     { 
      privAcct = "MyAccount"; 
      privPin = "MyPin"; 
     { 
     void changeBalance(string acct, string pin) 
     { 
      if(acct == privAcct && pin == privPin) 
      { 
       cout << "YAY! You can do this!" << endl; 
      } 
     } 
     void otherMethod(string acct, string pin) 
     { 
      if(acct == privAcct && pin == privPin) 
      { 
       cout << "YAY! You can do this!" << endl; 
      } 
     } 
private: 
     string privAcct, privPin; 
}; 

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

Хотя я думал, что может быть хорошей идеей потенциально создать один метод, а затем иметь оператор switch для доступа к различным частям метода, я хочу иметь доступ к части «changeBalance» или «changeBalance», otherMethod "класса. Я просто не был уверен, есть ли способ сделать это немного «опрятным» или упростить его?

Мой весь код заключается в следующем:

#include <cstdlib> 
#include <iostream> 
#include <string> 

using namespace std; 
void accountInfo(); 

class account{ 
public: 
    //constructor 
    account() 
    { 
     balance = 0.00; 
     accountNum = "0303"; 
     pin = "2222"; 
    } 
    //default for wrong entry response 
    void wrongEntry() 
    { 
     cout << "Wrong account number or PIN. Please try again.\n" << endl; 
    } 
    //change pin number 
    void changePin(string actNum, string oldPin) 
    { 
     if(actNum == accountNum && oldPin == pin) 
     { 
      string newPin; 
      cout << "Please enter in a new pin: "; 
      cin >> newPin; 
      pin = newPin; 
      cout << "Thank you." << endl; 
     } 
     else 
     { 
      wrongEntry(); 
     } 
    } 
    //change balance 
    void changeBalance(string actNum, string pinnum) 
    { 
     if(actNum == accountNum && pinnum == pin) 
     { 
      double newAdd; 
      cout << "Your current balance is " << balance << "\nPlease enter the additional amount you would like to deposit: "; 
      cin >> newAdd; 
      balance += newAdd; 
      cout << "Your new balance is " << balance << ".\nThank you.\n" << endl; 

     } 
     else 
     { 
      wrongEntry(); 
     } 
    } 
    //print balance and account # 
    void printBalance(string actNum, string pinnum) 
    { 
     if(actNum == accountNum && pinnum == pin) 
     { 
      cout << "For account #"<< accountNum << endl; 
      cout << "Your current balance is $" << balance << ".\nThank you.\n"; 
     } 
     else 
     { 
      wrongEntry(); 
     } 
    } 

private: 
    string accountNum, pin; 
    double balance; 
}; 

int main() 
{ 
    int input; 
    string aN, pin; 
    account bo; 

    while(1) 
    { 
     cout << "Please enter account number: "; 
     cin >> aN; 
     cout << "Please enter corresponding PIN: "; 
     cin >> pin; 

     ///options 
     cout << "Please choose from the following options:\n"; 
     cout << " 1. View Balance\n 2. Deposit\n 3. Change pin\nChoice: "; 
     cin >> input; 
     cout << endl; 
     switch(input) 
     { 
     case 1: 
      bo.printBalance(aN, pin); 
      break; 
     case 2: 
      bo.changeBalance(aN, pin); 
      break; 
     case 3: 
      bo.changePin(aN, pin); 
      break; 
     default: 
      cout << "The information you entered does not seem to match our records.\nPlease try again.\n"; 
      break; 
     } 
     char response; 
     cout << "\nAre you done with your transaction?: Y/N"; 
     cin >> response; 
     cout << endl; 
     if(response == 'Y' || response == 'y') 
     { 
      return 0; 
     } 
    } 
} 

Я понимаю, что я должен поставить свой класс в отдельных файлах заголовков, а также объявить конструктор правильно, но я только ищу, чтобы упростить код.

спасибо.

+0

Не красивый чистый C++ путь, но макрос может помочь здесь. – urzeit

ответ

1

Вы можете инкапсулировать «ограниченный» интерфейс в другой тип и разрешить создание этого типа только с допустимыми учетными данными. Что-то вроде

class Account { 
public: 
    struct Accessor { 
     Accessor(Account & a, string acct, string pin) : account(&a) { 
      if (acct != a.privAcct || pin != a.privPin) { 
       throw BadCredentials(); 
      } 
     } 

     void changePin() {account->changePin();} 
     // and other functions 

     Account * account; 
    }; 
private: 
    string privAcct, privPin; 

    // Only accessible through an Accessor 
    void changePin(); 
    // and other functions 
}; 

Использование:

Accessor(account, acct, pin).changePin(); 

Или, если весь интерфейс ограничен, вы можете просто поставить проверку в конструкторе самого Account.

1

Вы могли бы подумать об этом как о транзакциях.

(псевдо-код/​​дизайн)

transactionValid = BeginTransation(account, pin); 
if (transactionValid) 
{ 
    changePin(...); 
    chackBalance(...); 
} 
EndTransaction(); 
3

Вы можете создать новый класс, который содержит LoginCredentialsacct и pin как частные члены и функции-члены, которые будут проверять на равенство.

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

  • Нет связанных вопросов^_^