• 締切済み

[C++]値の引渡しについて。

教えて下さい。 mainの中においてasctimeで現在の日付を所得します。 その中の年だけをclassに渡し、classの中のメンバ関数で 使いたいのですが、mainからclassへはどう引き渡せばいいでしょうか? 汚いプログラムで申し訳ないのですが、mainのtm_yearの値を うるう年判定の関数で使いたいのです。 #include <iostream> #include<time.h> using namespace std; class TDate { public: int dt_month; int dt_day; int dt_year; bool leapYear; int year1; TDate(int month, int day, int year); void Display(); void Leap(); /*うるう年判定の関数*/ }; int main() { TDate dt_obj(11,1,2005); dt_obj.Display(); dt_obj.Leap(); struct tm *newtime; time_t aclock; char *now; time(&aclock); /* 現在時刻の獲得 */ newtime = localtime(&aclock); /* tm構造体への変換 */ now = asctime(newtime); /* 文字列への変換 */ cout << "現在の時刻" << now << endl; cout << "YEAR" << newtime -> tm_year << endl; return 0; } TDate::TDate(int month, int day, int year) { dt_month = month; dt_day = day; dt_year = year; } void TDate::Display() { cout << dt_month << "/" << dt_day << "/" << dt_year << endl; } void TDate::Leap() { year1 = n+1900; if ( year1 <= 0) cout << " Wrong year : Greater or equal to 0 " << endl; else { if ((year1 % 100) == 0 ) leapYear = ((year1 % 400) == 0 ); else leapYear = ((year1 % 4) == 0 ); if (leapYear) cout << year1 << " is a leap year " << endl; else cout << year1 << "is not a leap year" << endl; } } よろしくお願いします。

みんなの回答

回答No.1

・クラス内のメンバ変数(Ex:dt_year)をpublicにしてしまっては、折角クラスで隠蔽する意義が薄れます。 ・関数内でのみ使う変数(Ex:year1)は、ローカル変数で充分。メンバ変数にする必要がないでしょう。 それはさておきまして。 tm_yearをTDate::Leap()で使いたいのなら、TDate::Leap(int year)とでもして引き渡せば宜しいかと。 クラスの仕様が判らないのでなんとも言えませんが、Leap()はどんな関数なんでしょうか。 判定をする関数で出力もする、メンバ変数の更新をする、なんてやっていては使い勝手も悪いしそもそも設計の「せ」の字もありません。 「汚いプログラム」以前に基礎からきちんと実習することをお勧めしておきます。

star323
質問者

お礼

回答ありがとうございます。 >>・クラス内のメンバ変数(Ex:dt_year)をpublicにしてしまっては、折角クラスで隠蔽する意義が薄れます。 これはこの場合どちらでも良いと言われたので、privateに入っていたものを わかりやすくするためpublicに移しました。 お察しの通りですが、わかっております。 >>判定をする関数で出力もする、メンバ変数の更新をする、なんてやっていては使い勝手も悪いしそもそも設計の「せ」の字もありません。 「汚いプログラム」以前に基礎からきちんと実習することをお勧めしておきます。 今まさにその実習のときなんでお許し下さい。 色々試行錯誤の途中で、理解を深めています。 >>tm_yearをTDate::Leap()で使いたいのなら、TDate::Leap(int year)とでもして引き渡せば宜しいかと。 やってみます。

関連するQ&A

  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語を学習していてつまづいたので、皆さんの意見を聞きたいと思います。 現在、カレンダーを表示するプログラムをつくっています。 Yearとmonthをユーザが入力すると、その年その月のカレンダーが出るという算段です。(画像貼っておきます。ソースコードは下) これはできました。 これをいじって、Yearをユーザから受け取ると、その年の1月から12月までのカレンダーがば~っと表示されるようにしろ、と言われました。 Yearとmonthを受け取って書くやつは友人の助けを得ながらなんとかかけましたが、もう無理です。多分、for文を使うんだと思うんですが……助けてください! #include <stdio.h> int dayofweek(int year, int month); int daysinmonth(int year, int month); int daysinyear(int year); void showcal(int dow, int days); int main(void) { int year, month; int dow; int dim; printf ("Year?: "); scanf ("%d", &year); printf ("Month?: "); scanf ("%d", &month); dow = dayofweek(year, month); dim = daysinmonth(year, month); showcal(dow, dim); return 0; } void showcal (int dow, int days) { int i, j, d; printf ("Su Mo Tu We Th Fr Sa\n"); d = 1; for (i = 0; i < dow; i++) { printf (" "); } for (; i < 7; i++) { printf (" %d ", d); d++; } printf("\n"); for (j = 0; d <= days; j++) { for (i = 0; i < 7 && d <= days; i++) { if (d < 10) printf (" %d ", d); else printf ("%d ", d); d++; } printf("\n"); } } int daysinmonth( int year, int month) { int dim; dim = 31; if (month == 4 || month == 6 || month == 9 || month == 11) dim = 30; if (month == 2) { if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) dim = 29; else dim = 28; } return dim; } int daysinyear( int year) { int diy; if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0) diy = 366; else diy = 365; return diy; } int dayofweek (int year, int month) { int dow; int days; int y, m; if (year >= 2000) { days = 0; for ( y = 2000; y < year; y++ ) { days = days + daysinyear(y); } for ( m = 1; m < month; m++ ) { days = days + daysinmonth(year, m); } dow = (6 + days) % 7; } else { days = 0; for ( m = month; m <= 12; m++ ) { days = days + daysinmo

  • 現在時刻をyyyymmddhhmmss形式で変数に格納する

    いつもお世話になっております。 現在時刻を取得し、yyyymmddhhmmss形式で ひとつの変数に持たせたいとおもっているのですが 可能でしょうか? ---------- 1 #include <stdio.h> 2 #include <time.h> 3 4 int main(void) 5 { 6 struct tm *date; 7 time_t now; 8 int year; 9 int month; 10 int day; 11 int hour, minute, second; 12 13 /* 現在の日時を取得 */ 14 time(&now); 15 date = localtime(&now); 16 17 year = date->tm_year + 1900; 18 month = date->tm_mon + 1; 19 day = date->tm_mday; 20 hour = date->tm_hour; 21 minute = date->tm_min; 22 second = date->tm_sec; 23 24 return 0; 25 26 } 27 --------------- yearからsecondを結合してひとつの変数に格納することは可能でしょうか??

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • C言語 初心者です。

    いつもお世話になっています。 以下のソースはファイルに今日の日付を書き込み、それをコマンドプロンプトに表示させたいと思い作成しましたが、できません。 どうか教えてください。 #include <time.h> #include <stdio.h> void put_data(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); fp = fopen("time.txt", "w"); int year, month, day; fprintf(fp, "%d%d%d%d\t",local->tm_year + 1900, local->tm_mon + 1, local->tm_day); printf("%d%d%d%d\n", year, month, day); fclose(fp); } int main(void) { put_data(); return 0; }

  • C言語

    #include <stdio.h> int main(void) { int month, days; puts("月を入力してください:"); scanf("%d",&month); // if(month == 2) days = 28; if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12); days = 31; else days=30; printf("%d月は%d日あります。\n", month, days); return(0); } // 月と日数の場合わけをしたいのですがうまくいきません。どこをなおせばいいのか誰か教えてください!

  • C言語

    #include <stdio.h> int main(void) { int month, days; puts(\"月を入力してください:\"); scanf(\"%d\",&month); // if(month == 2) days = 28; if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12); days = 31; else days=30; printf(\"%d月は%d日あります。\\n\", month, days); return(0); } // 月と日数の場合わけをしたいのですがうまくいきません。どこをなおせばいいのか誰か教えてください!

  • C++初心者です

    C++初心者です どうも行き詰ってしまったのでまた投稿させていただきました。 文字数が足りないため前回の投稿から何を作ろうとしているか見ていただけると嬉しいです。 http://okwave.jp/qa/q5993632.html どうか間違っているところご指摘お願いできないでしょうか。 最後の部分は根本的にできていないので助けていただけると幸いです #include <iostream> #include <string> #include <cstdlib> #include <ctime> #include <map> using namespace std; class Cards { string Name; string Explain; public: Cards(const string e):Explain(e){} const string GetExplain() const {return Explain;} }; class Game { public: static const int KindsOfCards = 4; virtual Cards* SetCard(); }; Cards* Game::SetCard() { switch(rand() % KindsOfCards) { case 1: return new Square; case 2: return new Half; case 3: return new Reverse; case 4: return new Plus; } } class Square : public Cards { public: Square() : Cards("「二乗」 (二乗する)"){} virtual void Excute(); }; class Half : public Cards { public: Half() : Cards("「半分」 (2分の1にする)"){} virtual void Excute(); }; class Reverse : public Cards { public: Reverse() : Cards("「反転」 (符号を反転する)"){} virtual void Excute(); }; class Plus : public Cards { public: Plus() : Cards("「Plus17」", "(17を加える)"){} virtual void Excute(); }; void Square::Excute() { Now[i+1] = Now[i]*Now[i]; return Now[i+1]; } void Half::Excute() { Now[i+1] = Now[i]/2; return Now[i+1]; } void Reverse::Excute() { Now[i+1] = Now[i]*(-1); return Now[i+1]; } void Plus::Excute() { Now[i+1] = Now[i]+(17); return Now[i+1]; } int main() { int Level; Level = 3; srand((unsigned) time(NULL)); map<int,int> Target; for(int i = 0; i <= Level; i++) { Target[i]; } int Now; int T(int t) { public: Cards* c = SetCard(); Target[0](int t0){t0 = rand() % 100;} Target[0] = Now; Target[1](int t1){t1 = c->Excute();} target[2](int t2){t2 = c->Excute();} Target[3](int t3){t3 = c->Excute();} target[3] = t; } cout << "●所有しているカード●" << endl; for(int i = 1; i <= Level; i++) { cout << i << ":" << c->GetExplain() << endl; } cout << "目 標 値:" << T << endl; cout << "現在の数値:" << Now << endl; }

  • C言語について

    #include <stdio.h> #include <string.h> #include <time.h> typedef struct { int day; double dist; char comment[32]; } diary; void writeData(char datafile[]); void viewData(char datafile[]); char datadir[] = "dat/"; int year, month, day; int main(int argc, char* argv[]) { char datafile[11]; struct tm *date; time_t now; now = time(NULL); date = localtime(&now); year = date->tm_year + 1900; month = date->tm_mon + 1; day = date->tm_mday; sprintf(datafile, "walk%04d%02d", year, month); if ((argc > 1) && (strcmp(argv[1], "-view")==0)) { viewData(datafile); } else { writeData(datafile); } return 0; } void writeData(char datafile[]) { diary today_data; FILE *outfp; //出力ファイルのファイルポインタ char y_n = 'n'; char filename[15]; char input_str[12]; printf("%d/%d/%dの記録をしますか? (y/n) > ", year , month, day); scanf("%c", &y_n); while (getchar() != '\n') { } if(y_n != 'y') { printf("記録する日付は?(例:%d %d %d) > ", year, month, day); year = 0; month = 0; day = 0; gets(input_str); sscanf(input_str, "%d %d %d", &year, &month, &day); if((year > 9999) || (month > 12) || (month < 1) || (day > 31) || (day < 1)) { printf("日付が正しくありません\n"); return; } sprintf(datafile, "walk%04d%02d.txt", year, month); } today_data.day = day; printf("距離は? > "); scanf("%lf", &today_data.dist); while (getchar() != '\n') { } printf("コメントは?(30文字以内) > "); fgets(today_data.comment, 32, stdin); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { while (getchar() != '\n') { } } sprintf(filename, "%s%s", datadir, datafile); if((outfp = fopen(filename, "a+")) == NULL) { printf("ファイルオープンエラー\n"); return; } fprintf(outfp, "%d %.2lf ", today_data.day, today_data.dist); if((strlen(today_data.comment) == 31) && (today_data.comment[30] != '\n')) { today_data.comment[30] = '\n'; today_data.comment[31] = '\0'; } fprintf(outfp, "%s", today_data.comment); fclose(outfp); printf("記録しました"); } void viewData(char datafile[]){ } このソースの char datadir[] = "dat/";この宣言はディレクトリを指しているんですよね? この場合の/はどおいう意味ですか? 教えてください

  • operator * について

    掛け算ではない方の operator * についての質問です。 下のソースを見てください。関数func()内で、(*this)[idx]というやり方と、直接operator [] を呼び出すやり方を試しています。(*this)[idx]は自分のコピーを作ってしまわないでしょうか?このようなやり方は正しいでしょうか。というのが第1の質問です。 さらに、CTestで operator * を定義していますが、(*this)[idx]で呼び出されません。なぜなのでしょうか。というのが第2の質問です。 どうぞよろしくお願いいたします。 class CTest : public vector<int> { public: CTest() : vector<int>() { push_back(1); push_back(2); push_back(3); } void func() { #if 1 // 質問1 この書き方をしてもコピーが作られないかどうか? cout<<(*this)[0]<<endl; cout<<(*this)[1]<<endl; cout<<(*this)[2]<<endl; #else cout<<operator[](0)<<endl; cout<<operator[](1)<<endl; cout<<operator[](2)<<endl; #endif } CTest& operator * () { // 質問2 なぜこのオペレータが呼び出されないのか cout<<"???"<<endl; return *this; } }; void main(void) { CTest inst; inst.func(); }

  • C++

    今、下のようなプログラムを作っています #include <iostream> #include <iostream> using namespace std; int i=0, c=0, n; char str[10]; class X16karax10{ //16進から10進ヘ public: void keisan(); }; void X16karax10::keisan(void){ cout<<"16進を入力して下さい"<<endl; cout<<"英数字は大文字で入力してください(F→○ f→×)" <<endl; scanf("%s",str); while(str[i] != '\0'){ n = n * 0x10; c = str[i++]; if((c >= '0') && (c <= '9')){ n += c - '0'; } else if((c >= 'A') && (c <= 'F')){ n += c - 'A' + 10; } } cout<<("%d\n",n)<<"です\n"<<endl; } int main(){ for(i=0; ; i++){ X16karax10 p; p.keisan(); } } 16進を十進に変えるものなのですがreturn 0を使うと「X16karax10::keisan()' は値を返せない」と、でてしまうのですがどうしたらよいでしょうか?