2016-09-10 13 views
0

私はC++でATMオブジェクト指向プロジェクトを書いています。ここではC#の実装が見つかりました。これは PDF file with implementationです。 私はこのプロジェクトをC++に変換し、Code :: Blocksでビルドしようとしていました。 現在、私はプロジェクトをデバッグしようとしていますが、多くのエラーが発生します。私はそれらのいくつかを解決することができましたが、まだ新しいものが現れています。現在、私は何かにこだわっていて、私が助けてくれる答えが見つからない、誰かが私にここで起こっていることを説明するかもしれない。ここでエラーが参照するオブジェクトのコードは次のとおりです。C++のATMプロジェクト - コンパイラはオブジェクトが関数だと思いますか?

`

ATM::ATM() 
{ 
    userAuthenticated = false; 
    currentAccountNumber = 0; 
    Screen screen; 
    Keypad keypad; 
    CashDispenser cashDispenser; 
    DepositSlot depositSlot; 
    BankDatabase bankDatabase; 
} 

void ATM::Run() 
{ 
    while(true) 
    { 
     while(!userAuthenticated) 
     { 
      screen.DisplayMessage("Welcome!\n"); 
      AuthenticateUser(); 
     } 

     PerformTransactions(); 
     userAuthenticated = false; 
     currentAccountNumber = 0; 
     screen.DisplayMessage("\nThank you! Goodbye!\n"); 
    } 
} 

void ATM::AuthenticateUser() 
{ 
    screen.DisplayMessage("\nPlease enter your account number: "); 
    int accountNumber = keypad.GetInput(); 

    screen.DisplayMessage("\nPlease enter your PIN number: "); 
    int pin = keypad.GetInput(); 

    userAuthenticated = bankDatabase.AuthenticateUser(accountNumber, pin); 

    if (userAuthenticated) 
     currentAccountNumber = accountNumber; 
    else 
     screen.DisplayMessage("Invalid account number or PIN, please try again.\n"); 
} 

void ATM::PerformTransactions() 
{ 
    Transaction currentTransaction; 
    bool userExited = false; 

    while (!userExited) 
    { 
     int mainMenuSelection = ATM::DisplayMenu(); 

     switch((MenuOption)mainMenuSelection) 
     { 
     case BALANCE_INQUIRY: dzialalo 
     case WITHDRAWAL: 
     case DEPOSIT: 
      currentTransaction = CreateTransaction(mainMenuSelection); 
      currentTransaction.Execute(); 
      break; 
     case EXIT_ATM: 
      screen.DisplayMessage("Exiting the system\n"); 
      userExited = true; 
      break; 
     default: 
      screen.DisplayMessage("Wrong input, try again\n"); 
      break; 

     } 
    } 
} 

int ATM::DisplayMenu() 
{ 
    screen.DisplayMessage("\nMain menu: \n1. - View balance \n2. - Withdraw cash \n3. - Deposit cash \n4. - Exit \nEnter a number:\n"); 
    return keypad.GetInput(); 
} 


Transaction ATM::CreateTransaction(int type) 
{ 

    switch((MenuOption)type) 
    { 
    case BALANCE_INQUIRY: //MenuOption.BALANCE_INQUIRY gdyby nie dzialalo 
     BalanceInquiry temp(currentAccountNumber,screen,bankDatabase); 
     break; 
    case WITHDRAWAL: 
     Withdrawal temp(currentAccountNumber,screen,bankDatabase,keypad,cashDispenser); 
     break; 
    case DEPOSIT: 
     Deposit temp(currentAccountNumber,screen,bankDatabase,keypad,depositSlot); 
     break; 
    } 
    return temp; 
} 

`

私はプロジェクト全体を実行しようとすると、私はこのエラーを取得: ERRORS I GET

は、コンパイラです関数の中で、ATM :: PerformTransactions()は私が作成しようとしているオブジェクトが関数であることを教えてくれますか?どのように可能ですか?そのようなオブジェクトを作成することは可能ではありませんか? Transaction currentTransaction誰かが間違っていることを教えてもらえますか?私は本当にあなたの助けに感謝します。

+1

エラーメッセージはクリアです。デフォルトコンストラクタはありません。静的なオブジェクトではなく、動的なオブジェクトの作成が必要な場合があります。ポインタ。 –

+1

実際の問題は、C++がC#と同じように動作し、C++コードを書く際のモデルとしてC#を使用していることを前提としています。例えば、 'CreateTransaction'はC++プログラマが書いた方法ではありません。コンパイルした場合、オブジェクトのスライシングの問題が発生します。 – PaulMcKenzie

答えて

0

残念ながら、問題が何であるか正確に言うのは難しいです。これはminimal, complete and verifiable exampleではないからです。言っ

は、エラーは、この関数の中で、おそらくです:

Transaction ATM::CreateTransaction(int type) { 
    switch((MenuOption)type) { 
    case BALANCE_INQUIRY: 
     BalanceInquiry temp(currentAccountNumber,screen,bankDatabase); 
     break; 
    case WITHDRAWAL: 
     Withdrawal temp(currentAccountNumber,screen,bankDatabase,keypad,cashDispenser); 
     break; 
    case DEPOSIT: 
     Deposit temp(currentAccountNumber,screen,bankDatabase,keypad,depositSlot); 
     break; 
    } 

    return temp; 
} 

それがあるべき何かのように:

Transaction* ATM::CreateTransaction(int type) { 
    switch((MenuOption)type) { 
    case BALANCE_INQUIRY: 
     return new BalanceInquiry(currentAccountNumber,screen,bankDatabase); 
    case WITHDRAWAL: 
     return new Withdrawal(currentAccountNumber,screen,bankDatabase,keypad,cashDispenser); 
    case DEPOSIT: 
     return new Deposit(currentAccountNumber,screen,bankDatabase,keypad,depositSlot); 
    } 
} 

以上C++ 14-っぽい

std::unique_ptr<Transaction> ATM::CreateTransaction(int type) { 
    switch((MenuOption)type) { 
    case BALANCE_INQUIRY: 
     return std::make_unique<BalanceInquiry>(currentAccountNumber,screen,bankDatabase); 
    case WITHDRAWAL: 
     return std::make_unique<Withdrawal>(currentAccountNumber,screen,bankDatabase,keypad,cashDispenser); 
    case DEPOSIT: 
     return std::make_unique<Deposit>(currentAccountNumber,screen,bankDatabase,keypad,depositSlot); 
    } 
} 

承認済みBalanceInquiry,いくつかのエラー、それが働いていた場合、それはスライスされたオブジェクトに場所を与えているであろうと、すべての事実を最初にそこ元のコードではもちろん

のとDeposit継承Transaction、。
スライシングについての質問ではなく、私はむしろ詳細についてはsearch on SOに提案したいと思います。

0

currentTransactionの宣言は、自動的に、多くの場合、コンパイラによって生成されるデフォルトコンストラクタ

void ATM::PerformTransactions() 
{ 
    Transaction currentTransaction; 
    ... 
} 

を呼び出します。 Transactionのデフォルトのコンストラクタを自動的に生成することはできません。おそらくTransactionクラスのフィールドにはデフォルトのコンストラクタがありません。

だから、そのフィールドのTransaction呼び出し、適切なコンストラクタのために、このようなデフォルトコンストラクタを実装するか、デフォルトのコンストラクタを提供しないし、あなたが動的割り当てのいずれかを使用:CreateTransactionの署名を次のように変更して

void ATM::PerformTransactions() 
{ 
    std::unique_ptr<Transaction> currentTransaction; 
    bool userExited = false; 

    while (!userExited) 
    { 
     int mainMenuSelection = ATM::DisplayMenu(); 
     switch((MenuOption)mainMenuSelection) 
     { 
     case DEPOSIT: 
      currentTransaction = CreateTransaction(mainMenuSelection); 
      currentTransaction->Execute(); 
      break; 
      ... 
     } 
    } 
} 

を。

std::unique_ptr<Transaction> 
ATM::CreateTransaction(int type) { 
    std::unique_ptr<Transaction> result; 
    switch((MenuOption)type) { 
    case BALANCE_INQUIRY: 
     result.reset(new BalanceInquiry(currentAccountNumber,screen,bankDatabase)); 
     break; 
    case WITHDRAWAL: 
     result.reset(new Withdrawal(currentAccountNumber,screen,bankDatabase,keypad,cashDispenser)); 
     break; 
    case DEPOSIT: 
     result.reset(new Deposit(currentAccountNumber,screen,bankDatabase,keypad,depositSlot)); 
     break; 
    } 

    return result; 
} 
関連する問題