C++言語でコードを修正・補足する方法

このQ&Aのポイント
  • C++言語で自分で書いたコードを修正・補足する方法について教えてください。
  • 具体的な要件として、抽象基底クラスAccountの作成、純粋仮想関数Display()の実装、例外オブジェクトNEGATIVE_BALのthrow、Transaction()関数の実装、継承クラスRegularAccountとSecretAccountの作成などが挙げられます。
  • また、メインプログラム内でアカウントの追加、トランザクションの実施、全アカウントの情報表示などを行う必要があります。
回答を見る
  • ベストアンサー

C++言語で、どうこのコード続けたらいいかわかりません。

C++言語で、自分なりにコードを書いてみたのですが、途中からちんぷんかんぷんになってしまい、どう修正して何を続けて書いたらいいかわかりません。このプログラムの修正・補足をお願いできないでしょうか? やりたいこと: 1、name, account number, balance, last transaction amount, total count of transactionsを含む抽象基 底クラス“Account”の作成。 2、クラス内に情報を表示するための純粋仮想関数“Display()”の設置と定義。 3、クラス内で例外オブジェクトNEGATIVE_BAL()をthrow(バランスが0未満になった時)。 4、アカウントバランス修正のための“Transaction()”の設置と定義。 5、Accountから派生した継承クラス“RegularAccount”の作成。メンバ関数“Display()”は全アカウント情報を表示。 6、同じくAccountから派生した継承クラス“SecretAccount”の作成。メンバ関数“Display()”はname以外のアカウント情報 を表示。nameはユーザーがパスワードを入力したら表示する。 7、メインプログラム内に、10個別々のアカウントの配列を設置。(それぞれの配列内のアカウントはユーザー入力次第で RegularAccount か SecretAccount)。 8、MENU: (A)dd a new account, (T)ransaction, (R)eport all accounts: を表示。 ユーザー選択(A)の場合:ユーザーにアカウントタイプを選択させて (RegularAccountかSecretAccount)、そのバランスを 開く。(SecretAccountを選んだ場合、name を表 示するためのパスワードも入力させる。) ユーザー選択(T)の場合:ユーザーにアカウントナンバー(1~10)を入 力させて、修正した総計(last transaction amount) を入力させる。 ユーザー選択(R)の場合:全アカウントの情報を表示。(バランスが0未満の 時は、修正(transaction)を許可しない。) template <class T> class Account { public: Account(){}; virtual void Display() =0; class NEGATIVE_BAL{}; void Transaction (float amt); private: char name; int accountNum; float balance; float lastAmount; int totalCount; }; template <class T> class RegularAccount : public Account<T> { void Display(); }; template <class T> class SecretAccount : public Account<T> { void Display(); }; template <class T> void Account<T>::Display() { //わかりません } template <class T> void Account<T>::Transaction (float amt) {if (balance + amt < 0.0) throw NEGATIVE_BAL(); else {balance += amt; totalCount++; lastAmount = amt; } } template <class T> void RegularAccount<T>::Display() { Account<T>::Display(); } template <class T> void SecretAccount<T>::Display() { Account<T>::Display(); } int main() { cout << "MENU: (A)dd a new account,\n"; cout << " (T)ransaction,\n"; cout << " (R)eport all accounts:\n" << endl; return 0; } いろいろ足りなくてすいません。宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

// RegularAccountとSecretAccountのDisplay()をpublic:にします。 template <class T> void Account<T>::Display() { cout << 'A';//わかりません } // } int main() { char menu; RegularAccount<double> reg; SecretAccount <double> sec; cout << "MENU:" " (A)dd a new account,\n"; cout << " (T)ransaction,\n"; cout << " (R)eport all accounts:\n" << endl; cin >> menu; switch(menu){ case 'A': break; case 'T': reg.Transaction(100); sec.Transaction(10); break; case 'R': reg.Display(); sec.Display(); break; } return 0; }

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

クラスがどういう構造をしているのか, あるいはメンバ関数がどのような機能を持っていてそのためにはどのような処理をしなければならないのか, プログラムを「書く前」に固めてますか?

関連するQ&A

  • C++のtemplateクラス前方宣言について教えてください

    C++で、以下のようなコードを書いたのですがコンパイルが通りません。 どのようにコードを修正すればコンパイルを通すことができるでしょうか??教えてください。 template <class _T> class Test; // 上をclass Test<_T>にしてもコンパイルは通りません void main() {   Test<int> hoge; } template <class _T> class Test { public:   _T val;   Test():val(0){}; }; /*! エラー内容: 前方宣言class Test;の場合 'hoge'が未定義のclass'Test<_T>'で使用しています。   with   {     _T=int   } 前方宣言class Test<_T>;の場合 構文エラー:';'が'<'の前にありません。 構文エラー:'<' 'hoge'が未定義のclass 'Test<_T>'で使用しています。 */ 開発環境: VisualStudio2005 AcademicEdition WindowsXP Professional メモリ:2048MB CPU:Core2Duo 1.33GHz よろしくお願いします。

  • java ジェネリックスに関して

    以前にも似たような質問をしたことがありますが、それに関しての質問です。 次のようなプログラムを書きました。 class A<T> {  public void display(T t) {   System.out.println("A class");  } } public class Test extends A<String> {  public void display(Object t) {    //問題の行   System.out.println("Test class");  }  public static void main(String[] args) {     } } 上記の問題の行のところでエラーが出ました。 名前の競合: 型 Test のメソッド display(Object) は型 A<T> の display(T) と同じ erasure を持っていますが、オーバーライドしません A<T>のメソッドdisplay(T)のerasureはdisplay(Object)になるので、display(T)は確かにTestのメソッドdisplay(Object)と同じerasureを持っています。しかしそうなると、Testのdisplay(Object)のシグネチャがA<T>のメソッドdisplay(T)のシグネチャのerasureと同じになるため、オーバーライドできることになると考えたのですが、コンパイル結果はエラーとなってしまいました。 どうしてオーバーライドできないのでしょうか。 例えば public class Test extends A<String> を public class Test<T> extends A<T> にかえた場合はうまく行きました。従ってTをStringと指定しているところに問題があると思うのですが、どうしてコンパイルできないのでしょうか。 また、Testのdisplay(Object)をdisplay(String)にかえた場合(このとき、他の部分ははじめのプログラムと同じ)、A<T>クラスのdisplay(T)をオーバーライドできました。今度はTestクラスのdisplay(String)とA<T>クラスのdisplay(T)はerasureが同じではないので、オーバーライド等価ではない、従ってオーバーライドできないと思ったのですが、どうしてオーバーライドできるのでしょうか。

    • ベストアンサー
    • Java
  • C言語(線形リスト)

    #include <stdio.h> #include <string.h> typedef struct { char name[100]; double height, weight; } HW; int main (void) { FILE *fp; int i, ninzu = 0; char name[100]; double height, weight; double hsum = 0.0; double wsum = 0.0; HW class[100]; if ((fp = fopen ("hw.dat", "r")) == NULL) { perror ("\a ファイルをオープンできません。\n"); exit (1); } else { while (fscanf (fp, "%s %lf %lf", class[ninzu].name, &(class[ninzu].height), &(class[ninzu].weight)) == 3) { ninzu++; } for (i = 0; ninzu > i; i++) { printf ("%-10s %5.1f %5.1f\n", class[i].name, class[i].height, class[i].weigh t); hsum += class[i].height; wsum += class[i].weight; } printf ("----------------------------------------\n"); printf ("平均 %5.1lf %5.1lf\n", hsum / ninzu, wsum / ninzu); fclose (fp); } return (0); } このプログラムを100人分のデータをファイルから読み込んで線形リストにするにはどのようにプログラムを改良すれば良いのでしょうか?

  • C++のクラスで継承先の仮想関数をコンストラクタで呼ぶ方法について

    タイトルのとおり、C++のクラスで自分のクラスを継承した先の仮想関数をコンストラクタで呼ぶ方法についてなんですが、これは呼ぶことができないのが常識ですよね。 なのですが、いろいろとやってみたところ、制限はあるものの、なんとかそれっぽいのが作れたんです。 しかし、本当にこのコードが間違ったことをしていないという自信がありません……。 そこで皆さんにお訊ねします。 このコードはセーフでしょうか?アウトでしょうか? //----- ここから ----- #include <iostream> struct CLS{ virtual void func()=0; CLS(){} template<class T> CLS(T*){reinterpret_cast<T*>(this)->T::func();} }; struct CLS1:public CLS{ virtual void func(){ std::cout << "x";} CLS1():CLS((CLS1*)0){} template<class T> CLS1(T* x):CLS((T*)0){} }; struct CLS2:public CLS1{ virtual void func(){} CLS2():CLS1((CLS2*)0){std::cout<<"y";} template<class T> CLS2(T*):CLS1((T*)0){} }; int main(){ CLS* x = new CLS1; CLS* y = new CLS2; delete x; delete y; return 0; } //----- ここまで ----- C++の言語規約を読んだりとかはしていないので、自分では判断つきかねるのですが、コンパイラを通したところ、 cl g++ dmc bcc32 あたりで試して全て成功しています。(どのコンパイラでも、ということになるのかはわかりませんが。) セーフかアウトか…、またその理由をお聞かせください。 暇なときでかまわないので、ご意見いただけたらと思います。

  • C言語について質問です。

    C言語についての質問です。 C言語の問題で、 キーボードから氏名・身長・体重の値を受け取り、受け取った身長からもとめられる標準体重を受け取った体重から差し引いた値を計算する。 入力したデータと標準体重のデータを次のように表示するプログラムを作成せよ。 入力データ数は3件として、氏名、身長、体重、標準体重のデータは構造体に格納して、表示する際にデータの入った構造体を読み出すようにしなさい。 という問題があり、苦戦しております。 サンプルソースとして以下があり、 #include <stdio.h> #define NUMBER 3 typedef struct { char name[20]; float weight; float height; float diff; }MEMBER; int main(void){ int i; MEMBER member[NUMBER]; puts("氏名をおわすれなく"); /*構造体への入力部分*/ for(i=0;i<NUMBER;i++){ /*ここに追加*/ } /*構造体データを読み出して画面に表示する部分*/ printf("氏名\t身長[cm]\t体重[kg]\t体重-標準体重[kg]\n"); puts("--------------------------------------------------------"); for(i=0;i<NUMBER;i++){ printf("%s\t%8.1f\t%8.1f\t%8.1f\n", member[i].name,member[i].height, member[i].weight, member[i].diff); } puts("--------------------------------------------------------"); } 中央あたりの「構造体への入力部分」の書き方が分かりません。 どなたか手助けしていただけないでしょうか。

  • テンプレート引数の型を実行時に知りたいのですが・・・

    下記の関数 Func() の if 文の部分はどのように書いたらよいのでしょうか? どうぞよろしくお願いします。 template <class T> class TTest { ... T Min(); ... }; ... template <class T> T TTest<T>::Func() { ... if( Tが int なら ) { } else if( Tが float なら ) { } else if( Tが double なら ) { } ... }

  • c++ クラスに関してです。

    うまくクラス同士を連動させることができなくてエラーが出てしまいます。 どこが間違えているのかアドバイスくださると助かります。 #ifndef H22_H_ #define H22_H_ #include <string> #include "account.h" class Bank { public: Bank(); void deposit(double amount, const std::string& accountType); void withdraw(double amount, const std::string& accountType); void transfer(double amount, const std::string& accountType); double getBalance() const; double getSavingsBalance() const; double getCheckingBalance() const; private: Account checking, savings; }; #endif #ifndef ACCOUNT_H #define ACCOUNT_H #include <string> #include "account.h" class Account{ public: Account(); Account(double &amout); double deposit(double amount); double getBalance() const; double withdraw(double amount); double balance; private: }; #endif #include <iostream> #include "acount.h" using namespace std; Account::Account { balance = 0; } Account::Account(double amount) { balance = amount; } Account::double deposit() const { return balance; } Account::double getBalance(double balance) { balance += amount; return balance; } Account::double withdraw(double amount) { if(amount > balance) { balance -= 5; return balance; } elese { balance -= amount; return balance; }} h22.h の中身 #include <string> #include "h22.h" #include "account.h" #include <stdexcept> using namespace std; Bank::Bank() { Account checking; Account saving; } void Bank::deposit(double amount, const string& accountType) { if (accountType != "S" && accountType != "C") throw invalid_argument("Does not compute"); else if(accountType == "S") savings.balance += amount; else if(accountType == "C") checking.balance += amount; } void Bank::withdraw(double amount, const string& accountType) { if (accountType != "S" && accountType != "C") throw invalid_argument("Does not compute"); else if(accountType == "S") savings.balance -= amount; else if(accountType == "C") checking.balance -= amount; } void Bank::transfer(double amount, const string& accountType) { if (accountType != "S" && accountType != "C") { throw invalid_argument("Does not compute");} else if(accountType == "S") { savings.balance += checking.balance; savings.balance = 0;} else if(accountType == "C") { checking.balance += amount; checking.balance = 0;} } double Bank::getBalance() const { return getBalance(); } double Bank::getSavingsBalance() const { return savings.getBalance(); } double Bank::getCheckingBalance() const { return checking.getBalance(); } メイン.cpp http://pastebin.com/rQTj8xciです。 なにかヒントやアドバイスお願いします

  • C++で、クラスの受け渡しを行いたい

    C++を現在勉強中です。 java は少しだけわかるのですが、 以下のjavaのコードをC++で実現する方法が わかりません。 ------------------------------------------- class test2 { private test2() { } public test2(String hoge) { } } class test1 { private void method1(test2 t2) { } public static void main(String[] args) { test1 t1 = new test1(); } } ------------------------------------------- ようは、test2クラスのデフォルトコンストラクタを不可視にしておきながら、呼び出し側でどのように定義すればよいのかがわかりません。 どなたか回答お願いします。

  • フレンドクラスにできない

    mediatorクラスからCOuterクラスのメンバ変数にアクセスできるようにフレンドクラスにしたつもりなんですが、 うまくアクセスができずコンパイルエラーになってしまいます。 どこが悪いのか分からず困っています。 どなたか助けていただけませんか? mediator.h ----------------------------------------------------- template <class T> class mediator { public: mediator(T* p=NULL) : m_p(p) {} void SetOutClass(T*p) { m_p = pT;} T& GetOutClass() const { return *m_p;} private: T* m_p; }; #define outer GetOutClass() ----------------------------------------------------- COuter.h ----------------------------------------------------- class COuter { private: int m_a; public: void func() { class CInner : public mediator<COuter> { public: CInner(COuter *p) : mediator<COuter>(p) {} void func() { // フレンドクラスなのにアクセスできない!? outer.m_a = 1; } }; CInner inner(this); inner.func(); } friend class mediator<COuter>; }; -----------------------------------------------------

  • メンバ関数ポインタを値とするコンテナの定義方法

    こんにちは、boundaryといいます。 あるクラスのメンバ関数のポインタをmapで管理したいので すが、定義でエラーになってしまいます。 class CFunc { private: bool FuncA(); bool FuncB(); }; このようなクラスに対して、 template <class T> class FuncMap { private: typedef bool (T::*Func)(); typedef map<int, T::Func> _FuncMap; _FuncMap FMap; public: void set(int, T::Func); T::Func search(int); }; を用意しました。 template <class T> void FuncMap<T>::set(int i, T::Func pFunc) { FMap.insert(pair<int , T::Func>(i ,pFunc)); } template <class T> T::Func FuncMap<T>::search(int i) { map<T::Func, int>::iterator FuncMapIte; FuncMapIte = FMap.find(i); return T::Func; } と書いたのですが、 error C2244: 'FuncMap<T>::set' : 関数のオーバーロードが解決できません。 error C2954: テンプレートの定義はネストできません。 error C2244: 'FuncMap<T>::search' : 関数のオーバーロードが解決できません。 との事です。 色々試行錯誤したのですが、うまくいきません。 定義のどこがいけないのでしょうか? よろしくお願いします。 VC6.0SP5 WINDOWS2000です。

専門家に質問してみよう