2014-01-14 5 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

당신은 이것을 거래로 생각할 수 있습니다.

당신은 새로운 클래스의 private 멤버로 acctpin을 포함 LoginCredentials를 만들 수 있습니다

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

(의사 코드/디자인),와 평등을 확인하는 멤버 함수.