質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

c++における銀行口座

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,355

reotantan

score 257

コンストラクタの中にあるelse文の中で
このようなコードを使い、顧客番号を設定しようとしました。
しかしエラーが出てしまって、うまく機能していません。
文法上どのような誤りがあるのでしょうか?また先輩方にコード全体の改善点を指摘していだけると嬉しいです。
よろしくお願いします
ご指摘ありがとうございました。
コンストラクタが形成されると同時に0-1-2(顧客Aに0、顧客Bに1、顧客Cに2)というように番号を振っていきたかったので、下のコードを書きました。
今見てみると、このコードが機能しないのは分かります。
一つ浮かんだ考えとしてはコンストラクタの引数に顧客番号をいれてしまえばいいのではと思ったのですが、コンストラクタには初期値だけいれる単純なもののほうが好ましいと感じました。
そこで何かほかの方法がありましたら、教えていただけますか?

 balance =balanceA ;
        int k=0;
        Data_number[k]=k++;
    }
コード#include<iostream>
using namespace std;
class Bankaccount {
private:
    int balance;
    int Data_number[100];
public:
    Bankaccount(int a);
    int getBalance();
    void setBalance(int);
    int getData_number(int);
    void credit(int);
    void debit(int);

};
int Bankaccount::getBalance() {
    return balance;
}
void Bankaccount::setBalance(int a) {
     balance = a;
}
int Bankaccount::getData_number(int number){
    return Data_number[number];
}
Bankaccount::Bankaccount(int balanceA) {
    if (balanceA<= 0) {
        balanceA = 0;
        cout << "error";
    } else {
        balance =balanceA ;
        int k=0;
        Data_number[k]=k++;
    }
}
void Bankaccount::credit(int money){
    balance+=money;
}
void  Bankaccount::debit(int money){
    balance-=money;
}
int main() {
    Bankaccount a(3000);
    a.setBalance(4000);
    cout << a.getBalance()<<endl;
    a.debit(300);
    cout<<a.getBalance()<<endl;
    a.credit(1000);
    cout<<a.getBalance()<<endl;
    cout<<getData_number(0);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

取り敢えず下記を修正すればコンバイルと実行できました。

誤>    cout<<getData_number(0);
正>    cout<<a.getData_number(0);

単なるタイプミスではないでしょうか?

以下、ざっと私としては気になった点を書いてみます。他の方のご意見も参考にされて下さいね。

Data_numberという配列はなんの配列でしょうか?
もし顧客番号であれば、Customer_number等、意味が分かる名前にした方がよいと思います。
また、これは何故配列なのでしょうか?
そして、配列であれば添字オーバーチェックはやるべきです。getData_number()関数でnumberパラメータ異常の検出です。

下記はやりたいことがよく見えませんでした。
        int k=0;
        Data_number[k]=k++;
もし、0クリアならば、例えば下記でできます。
        for (int k=0; k < 100; ++k)
              Data_number[k]=0;

頑張って下さい。ではでは

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/27 01:58

    設定としましては、顧客番号は多くなることを予想しまして、配列のほうが効率が良いかなと思いました。添え字オーバーチェックですね、とても反省しています。
    回答者様なら顧客番号はどのように設定しますか?

    キャンセル

  • 2015/10/27 11:59

    まず、顧客1人1人毎にbalance(残高?)が必要になると理解しました。
    であれば、一般的には顧客番号はBankaccount内に1つだけですので、Data_numberも1つだけとした方が良さそうに思いました。(特殊なケースで1口座に複数の顧客がいるのでしたらごめんなさい。)

    次に顧客番号をBankaccountクラス内部で管理するのであれば、静的メンバ変数を使えば良いです。
    静的メンバ変数について解説しているサイトは多いので参考にされて下さい。
    例えば→http://ppp-lab.sakura.ne.jp/cpp/language/019.html

    以下、修正点です。
    reotantanさんがローカル変数kを静的メンバ変数へ変えただけです。ただ、メンバ変数名として"k"はあんまりですので、適切な名称に変更するべきです。

    #include<iostream>
    using namespace std;
    class Bankaccount {
    private:
    int balance;
    int Data_number;
    static int k;
    (中略)
    };
    (中略)
    int Bankaccount::getData_number(){
    return Data_number;
    }
    int Bankaccount::k=0;
    Bankaccount::Bankaccount(int balanceA) {
    if (balanceA<= 0) {
    balanceA = 0;
    cout << "error";
    } else {
    balance =balanceA ;
    Data_number=k++;
    }
    }
    (中略)
    int main() {
    Bankaccount a(3000);
    (中略)
    cout<<a.getData_number()<<endl;

    Bankaccount b(2000);
    cout<<b.getData_number()<<endl;
    }

    キャンセル

  • 2015/10/27 17:27

    何度も申し訳ありません、とてもコードの質が改善しました。
    ありがとうございます。
    回答者様のご指摘やほかの皆様のおかげで、コードがきれいになったと思います。
    ありがとうございました。
    #include<iostream>
    using namespace std;
    int Current_number;
    class Bankaccount {
    private:
    int balance;
    int Data_number;
    public:
    Bankaccount(int ,int);
    int getBalance();
    void setBalance(int);
    int getData_number();
    void credit(int);
    void debit(int);

    };
    int Bankaccount::getBalance() {
    return balance;
    }
    void Bankaccount::setBalance(int a) {
    balance = a;
    }
    int Bankaccount::getData_number() {
    return Data_number;
    }
    Bankaccount::Bankaccount(int balanceA,int num) {
    if (balanceA <= 0) { // whatever you put into balanceA ,since this is constructor so parameter will be automatically
    // be zero
    cout << "balance didnt change";
    } else {
    balance = balanceA; //
    Data_number = Current_number;
    Current_number++;
    }
    }
    void Bankaccount::credit(int money) {
    balance += money;
    }
    void Bankaccount::debit(int money) {
    balance -= money;
    }
    int main() {
    Bankaccount a(3000,0);
    a.setBalance(4000);
    cout << a.getBalance() << endl;
    a.debit(300);
    cout << a.getBalance() << endl;
    a.credit(1000);
    cout << a.getBalance() << endl;
    cout<<a.getData_number()<<endl;
    Bankaccount b(2000,1);
    cout<<b.getData_number();
    }


    キャンセル

0

だいたいChironianさんのご指摘と同じなのですが、それだけでは何ですので、技術的な点というよりは仕様設計として考えてほしい点を指摘させていただきます。

Bankaccountクラスのインスタンスを作成する際に、0以下の値をコンストラクタに渡すと、メンバ変数balanceが0で初期化されます(コードはbalanceAに0を代入していますが、ミスタイプですよね?)。

この時標準出力に"error"と出力されますが、このインスタンスは0で初期化されたものとして引き続き使用することは可能です。だとしたら、error表示はクラスを使用する人を悩ませかねないのではないでしょうか。使用する人というのは何も他人ばかりではなく何日か後の自分自身かもしれません。

もちろん、現在のソースコードはデバッグ段階のもので、リリース版までにはこのあたりをきちんと直されるのだとは思いますが、仕様的に何がエラー(以降の実行を止めるべきもの)で、何がエラーでないか(警告は出すが、問題をプログラム的に回避して以降の処理を継続させる)というものを押さえておくことを心がけるようにしておくと、後々見つけにくい不具合を埋め込んでしまうような事態を回避しやすいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/27 02:58

    とても参考になりました、ご指摘はとても納得のいくものでした。ありがとうございました

    キャンセル

0

1つの口座に複数のIDが必要になる状況がよくわかりませんが、
IDの発行を管理する何かを用意して、
口座の生成時にはそいつが発行したIDを設定する方法もあります。


あと細かいですが、Data_numberだけスネークケースなのがモヤモヤします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/27 17:28

    ご指摘の通りです、一つのIDを設定するコードに訂正しました。
    ありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る