関数の出力引数をクラスにするには?

このQ&Aのポイント
  • C++でクラスを出力する関数を作成する方法について質問です。
  • 提供されたソースコードでは、関数f2がうまく動作していないようです。
  • 出力引数にクラスを取ることはできるのでしょうか?
回答を見る
  • ベストアンサー

関数の出力引数をクラスにするには?

既出、または基礎の質問でしたらすみません。 ここでも他の検索エンジンでも見つけられなかったので。。。 C++です。 クラスを出力する関数を作りたいのですが、うまくできません。 ソースは以下のとおりです。問題は、プログラム下方のf1(),f2(),main()です。 長くて、そして見づらくてすみません・・・ //////////// #include<stdio.h> class test{ private: int num; float *vec; public: test(int n=1); //ctor ~test(); //dtor int getnum(){return num;} float* getvec(); void set(int,float*); void show(); }; test::test(int n){ num = n; vec = new float[n]; for(int i=0; i<n; i++) vec[i] = (float)i; } test::~test() {delete[] vec;} float* test::getvec(){ float *v; v = new float[num]; for(int i=0; i<num; i++) v[i] = vec[i]; return v; } void test::set(int n, float *v){ num = n; vec = new float[n]; for(int i=0; i<n; i++) vec[i] = v[i]; } void test::show(){ for(int i=0; i<num; i++) printf("%d: %g\n",i,vec[i]); } void f1(test &x, test &y){ int n; float *v; n = x.getnum(); v = x.getvec(); for(int i=0; i<n-1; i++) v[i] = 2.0*v[i]; y.set(n-1,v); } test f2(test x){ test y; //* int n; float *v; n = x.getnum(); v = x.getvec(); for(int i=0; i<n-1; i++) v[i] = 2.0*v[i]; y.set(n-1,v); return y; //** } void main(){ test x,y; int n = 4; float v[4] = {1.0,2.0,3.0,4.0}; printf("x:\n"); x.set(n,v); x.show(); printf("f1:\n"); f1(x,y); y.show(); printf("f2:\n"); y=f2(x); y.show(); } //////////// これを実行すると x: 0: 1 1: 2 2: 3 3: 4 f1: 0: 2 1: 4 2: 6 f2: 0: 7.38979e-38 1: 7.38979e-38 2: 6 となります。 関数f2がうまく動かない理由がわかりません。。。 出力引数にクラスはとれないのでしょうか?? よろしくお願いします。

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

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

なんで「代入演算子が不要だ」と思ったんだろ.... y = f2(x); ってまさに「代入」なんだけどなぁ....

mogia77
質問者

お礼

・・・まったく気づきませんでしたorz Cを久しぶりに使って、しかもクラスはきちんと勉強したことがなかったので・・・ 本当にありがとうございました!! 出直してきます。

その他の回答 (1)

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

自分でメモリ管理をするんだから, コピーコンストラクタとか代入演算子はほぼ必須だと思う.

mogia77
質問者

お礼

ご指摘、ありがとうございます。 今回のプログラムには使わないので、 勝手に不要だと思っていたのですが・・・ 両者を書き足してみます。

関連するQ&A

  • c言語 ファイル出力について

    このようなプログラムを作成しました。 エクセルでファイルを出力したいのですが… ファイルは作成できたものの、内容が書かれていません。 とても困っています↓ 自分の力不足なのでしょうがどなたかお願いします。 #include <stdio.h> #include <process.h> #define S 256 #define I 100 #define J 100 #define K 3 //グループの数 void sum(int u[][J],int N,int n); void sort(int y[],int N,int u[][J],int n); void group(int num[],int u[][J],int N,int n); void passege(int groupm[][J],int groupn,int u[][J],int n,int N); void main (void) { FILE *fp; int N=0,i=0,j=1,kou=0,n; //N:人数 n:問題数 static int u[I][J]; char buf[S]; //ファイルオープン if ((fp=fopen("data_i2_3.csv","r"))==NULL){ printf("Can't open File\n"); exit(1); } // 問題数のカウント fgets(buf,S,fp); N+=1; while(buf[i]!='\n'){ kou=kou++; i+=1; } for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } n=kou/2+1; // レコードの読み込み while (fgets(buf,256,fp)!=NULL){ N+=1; // 文字型から数値型へ変換 j=1; for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } } sum(u,N,n); fclose(fp); } void sum(int u[][J],int N,int n) { static int y[I]; int i,ii; //学習者iの得点の初期化 for(i=0;i<=I;i++) y[i]=0; //学習者iの得点の計算 for(i=1;i<=N;i++){ for(ii=1;ii<=n;ii++){ y[i]+=u[i][ii]; } } sort(y,N,u,n); } void sort(int y[],int N,int u[][J],int n) { int left,right,i,shift,t,v; static int num[I]; //学習者の番号記憶用変数numの初期化 for(i=0;i<=I;i++) num[i]=0; for(i=1;i<=N;i++) num[i]=i; //シェーカーソート left=0; right=N; while (left<right){ for(i=left;i<right;i++){ if(y[i]>y[i+1]){ t=y[i]; v=num[i]; y[i]=y[i+1]; num[i]=num[i+1]; y[i+1]=t; num[i+1]=v; shift=i; } } right=shift; for(i=right;i>left;i--){ if(y[i]<y[i-1]){ t=y[i]; v=num[i]; y[i]=y[i-1]; num[i]=num[i-1]; y[i-1]=t; num[i-1]=v; shift=i; } } left=shift; } group(num,u,N,n); } void group(int num[],int u[][J],int N,int n) { int groupn,i,j,k=1; //groupn:グループの人数 static int groupm[K][I]; //groupm:グループのメンバー groupn=N/K; for(i=0;i<K;i++){ for(j=0;j<groupn;j++){ groupm[i][j]=num[k]; k+=1; } } passege(groupm,groupn,u,n,N); } void passege(int groupm[][J],int groupn,int u[][J],int n,int N) { FILE *f; int i,j,k=0,l,tt; static int t[I]; //各グループの正解率 double p[K][J],pp=0.0; //初期化 for(i=0;i<K;i++){ for(j=0;j<J;j++){ p[i][j]=0; t[i]=0; } } for(i=0;i<K;i++){ for(j=0;j<groupn;j++){ t[k]=groupm[i][j]; k+=1; } } k=0; for(i=0;i<K;i++){ for(j=1;j<=n;j++){ for(l=0;l<groupn;l++){ tt=t[k]; pp=pp+u[tt][j]; k+=1; } p[i][j]=pp/groupn; pp=0.0; if(i==0) k=0; else k=groupn*i; } k=groupn*(i+1); } //ファイル出力 f=fopen("test1.csv","w"); //確認 putchar('\n'); for(i=0;i<K;i++){ for(j=1;j<=n;j++){ printf("%d群の項目%dの正解率は%fです\n",i,j,p[i][j]); } } //ファイルを閉じる fclose(f); }

  • メンバ関数の引数としてオブジェクトの配列をとれる?

    VC++6.0 on W2Kを使っている初心者です。 表題のとおりですが、具体的なプログラムは下のようです。 また、*部分に相当するところもエラーになるのですが、 どのように変えればよいのでしょうか? なお、プログラムの内容そのものには意味はなく 単に動作確認のためのサンプルです。 実行すると、 「How many cats do you create?」 と聞かれるので、数字を入力すると、 Nekoオブジェクトが生成され、i番目の猫にはiという名が付けられます。 そして、「何匹目を鳴かせますか?」と聞かれるので、 数字を入力すると、 「My name is i-th cat.」 と答えられ、さらに、Inuが、 「i-th cat is tasty.」 と答える、という内容になっています。 #include <iostream> #include <string> using namespace std; class Neko { int name; public: Neko(){} Neko(int n):name(n){} void setname(int n){name=n;} int getname(){return name;} void naku(int n) const; }; void Neko::naku(int i) const { cout <<"My name is "<<getname()<<"th cat."<<endl;・・・* } class Inu { public: Inu(){} void naku(int i) const; }; void Inu::naku(int i)const{ cout <<i<<"th cat is tasty."<<endl; } int main() { int i; int num; int temp; Neko *x; Inu y; cout <<"How many cats do you create?"<<endl; cin >>num; x=new Neko[num]; for(i=0;i<num;i++){ x[i].setname(i); } cout <<"何匹目を鳴かせますか?"<<endl; cin >> temp; x[temp].naku(); y.naku(temp); }

  • float型関数で定義するプログラミング

    今プログラミングを行っているのですが、Xn+1=Xn-f(Xn)/g(Xn)(f(x)=x*x-x-1,g(x)=2x-1,これらはfloat型の関数とすること)で初期値Xo=-2としたときに繰り返しxを求めていき、|f(x)|=<10^-5となるまで計算するプログラムを作成したいのですが結果がおかしくなるので、ここからどう手直しすればいいのかわかりません。 #include<stdio.h> float wa(void); int main(void) { float a,i; for (i = -2; i <= 0.00005; i++) { a = wa(); printf("%f\n", a); } return 0; } float wa(void) { float l = 0, i, m, n, x,b; for (i = -2; i <= 0.00005; i++) { x = i; l *= i; m = x*x - x - 1; n = (2 * x) - 1; b = l - (m / n); } return b; } 結果 -1.000000 -1.000000 -1.000000 正直言ってどういう結果になればいいのかもわかりません。 せめてどういうような結果になるのかだけでも教えていただければありがたいです。

  • C#で、引数にクラスの配列の参照パラメータを渡したい

    C#始めて3日目ですが、そろそろ挫折しそうです。 以下のクラス class Test{ int num; public Test(){ num = 0 }; ~Test(){}; public void set(int n){ num = n; } public int get(){ return num; } } があり、 void kakikae(Te [] t){ for(int i =0; i < 10; i++){ t[i].set(i); } } Test [] test = new Test[10] = { new Test, new Test, new Test, new Test, new Test, new Test, new Test, new Test, new Test, new Test }; kakikae(test); とした時に、test[0]からtest[9]まで 1,2,3,4,5,6,7,8,9 の値が入っている事がしたいのです。 要は、クラスの配列のポインタを渡して、相手側の関数で書き方内容が、関数から戻った時も値渡しでなく 参照渡しのように値が変わって戻ってきて欲しいです。 配列の仕組み、クラスの仕組み、パラメータの仕組みが 分からず、ここから進みません。 1から勉強できるC#の参考書も探しています。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • 引数のみで出力

    問題として main内部を変更してはならない。 関数sub()でmainのループと同じ出力するようにせよ。 ただし、関数subで引数以外の変数を宣言してはならない。 また、広域変数を追加してはならない。 となっていて、色々とforループで出力させようと 配列にしたりポインタにしたりしたのですが forのiに比例する配列をどう組めばいいのか、わからないです。。。 mainの出力は 1 8 15 22 29 36 となっています。 これをsubでもできるように設定するみたいです。 #include <stdio.h> #define MAX 7 void sub(int [MAX]); int main() { int i; int x[MAX]; for (i = 0; i < MAX-1; ++i) { x[i] = 7*i+1; } x[MAX-1] = 0; for (i = 0; x[i] > 0; ++i) { printf("x = %d\n", x[i]); } printf("print again\n"); sub(x); return 0; } void sub(int a[MAX]) { // a[6]=0 // MAX 7 a[MAX-1]=0; for(a[MAX-1];a[MAX-7]<=MAX-1;++a[MAX-1]){ //a[MAX-1] = 7*a[MAX-1]+1; printf("a[%d] = %d\n",a[MAX-1],a[MAX-7]); } }

  • エラーは出ませんが、実行結果ができません。

    このプログラムなんですが、エラーは出ませんが結果が 0群の項目1の正解率は0.000000です 1群の項目1の正解率は0.000000です 2群の項目1の正解率は0.000000です… この様になり、正解率がでません… 初心者で、わからないので困っています。 お願いします。 #include <stdio.h> #include <process.h> #define S 256 #define I 100 #define J 100 #define K 3 //グループの数 //#define M 50//サブコンテンツの数 void sum(int u[][J],int N,int n); void sort(int y[],int N,int u[][J],int n); void gunwake(int y[],int start,int N,int gunnum); void passege(int y[],int div[],int N,int num[],int u[][J],int n); static int y[I]; int div[K-1]; int divyouso=0; void main (void) { FILE *fp; int N=0,i=0,j=1,kou=0,n; //N:人数 n:問題数 static int u[I][J]; static int num[I]; char buf[S]; //ファイルオープン if ((fp=fopen("data_i2_1.csv","r"))==NULL){ printf("Can't open File\n"); exit(1); } // 問題数のカウント fgets(buf,S,fp); N+=1; while(buf[i]!='\n'){ kou=kou++; i+=1; } for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } n=kou/2+1; // レコードの読み込み while (fgets(buf,256,fp)!=NULL){ N+=1; // 文字型から数値型へ変換 j=1; for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } } sum(u,N,n); gunwake(y,0,N,K); passege(y,div,N,num,u,n); fclose(fp); } void sum(int u[][J],int N,int n) { //static int y[I]; int i,ii; //学習者iの得点の初期化 for(i=0;i<=I;i++) y[i]=0; //学習者iの得点の計算 for(i=1;i<=N;i++){ for(ii=1;ii<=n;ii++){ y[i]+=u[i][ii]; } } sort(y,N,u,n); } void sort(int y[],int N,int u[][J],int n) { int left,right,i,shift,t,v; static int num[I]; //学習者の番号記憶用変数numの初期化 for(i=0;i<=I;i++) num[i]=0; for(i=1;i<=N;i++) num[i]=i; //シェーカーソート left=0; right=N; while (left<right){ for(i=left;i<right;i++){ if(y[i]>y[i+1]){ t=y[i]; v=num[i]; y[i]=y[i+1]; num[i]=num[i+1]; y[i+1]=t; num[i+1]=v; shift=i; } } right=shift; for(i=right;i>left;i--){ if(y[i]<y[i-1]){ t=y[i]; v=num[i]; y[i]=y[i-1]; num[i]=num[i-1]; y[i-1]=t; num[i-1]=v; shift=i; } } left=shift; } } void gunwake(int y[],int start,int N,int gunnum){ int tmp; int i,up,down,real; if(gunnum>1){ tmp=N/gunnum+start; //printf("tmp:%d\n",tmp); for(i=tmp;y[tmp]==y[i];i--){ } down = i + 1; //printf("down:%d\n",down); for(i=tmp;y[tmp]==y[i];i++){ } up =i; //printf("up:%d/n",up); if(tmp-down > up-tmp) real=up; else real=down; div[divyouso]=real; divyouso++; printf("%d\n",real); gunwake(y,real,N-real,gunnum-1); } } void passege(int y[],int div[],int N,int num[],int u[][J],int n){ int div2[K+1]; int k=0,j,i; int pp[I][J]; div2[0]=0; div2[K]=n; for(i=0;i<K-1;i++){ div2[i+1]=div[i]; } for(k=0;k<K;k++){ for(j=0;j<n;j++){ pp[k][j]=0; for(i=div2[k];i<div2[k+1];i++){ pp[k][j]=pp[k][j]+u[num[i]][j]; } } } //確認 putchar('\n'); for(j=1;j<=n;j++){ for(k=0;k<K;k++){ printf("%d群の項目%dの正解率は%fです\n",k,j,pp[k][j]); } } }

  • float型関数の定義の仕方がわかりません。

    次のプログラミングでfloat型関数を定義しようとしても下の矢印のところにどんな文字を入れても「初期化されてないローカル変数が使用されます。」と出て、どうしてもうまくいきません。 こういう場合どこを直せばエラーが出なくなるのでしょうか? #include<stdio.h> float wa(float  );       ↑ int main(void) { float a; a = wa();      ↑ printf("%f\n",a); return 0; } float wa(float  )       ↑ { float l = 0, i, m, n, x,b; for (i = -2; i <= 0.00005; i++) { x = i; l *= i; m = x*x - x - 1; n = (2 * x) - 1; b = l - (m / n); } return b; }

  • N王妃システムの解のタイム計算

    先輩方にご協力をお願いしたく書き込みさせていただきます。 #include <stdio.h> #define FREE 0 #define BUSY 1 #define N 8 int q_pos[N+1]; int colum[N+1]; int r_up[2*N]; int r_dw[2*N]; void disp(void) { int y,x; static count = 0; printf("\n解 %d\n", ++count); for(y=1;y<=N; y++){ for(x=1;x<=N; x++){ if (q_pos[y] == x)printf("○"); else printf("×"); } printf("\n"); } } void eight_queens(int y) { int x; for (x=1; x<=N; x++){ if(colum[x]==FREE && r_up[y+x-1]==FREE && r_dw[y-x+N]==FREE){ q_pos[y]=x; if (y>=N) disp(); else{ colum[x]=BUSY; r_up[y+x-1]= r_dw[y-x+N]=BUSY; eight_queens(y+1); colum[x]=FREE; r_up[y+x-1]= r_dw[y-x+N]=FREE; } } } } int main(void) { int i; for(i=1;i<=N; i++) colum[i]=FREE; for(i=1;i<2*N;i++) r_up[i]= r_dw[i]=FREE; eight_queens(1); return 0; } こちらのプログラムに #include<stdio.h> #include<stdlib.h> #include<time.h> void sleep(clock_t wait); void main(void) { int i,j,n; time_t start,finish; double duration,v; printf("繰り返し回数は>"); scanf("%d",&n); time(&start); v=1.01; for(i=0; i<n; i++) { if(((i+1)% 10)==0) { fprintf(stdout,"."); fflush(stdout); } for(j=0; j<n; j++) { v *=1.0001; } } printf("\n"); time(&finish); duration=difftime(finish,start); printf("計算にかかった時間は約%6.2f 秒です \n", duration); } のプログラムを合体させ、1つのプログラムを完成させたいのですが、どのような配列にしたらいいのか教えて欲しいです>< アルゴリズムとしては、チェスのN王妃のプログラムから解を導きだすと同時に、そのプログラムを起動してから終わりまでのタイムを計算するプログラムを挿入すると言う内容です。 長くてすいません;;

  • vectorに格納されたオブジェクトの廃棄

    次のようなテストプログラムを作ってみました。 OSはVineです。 #include <iostream> #include <string> #include <vector> using namespace std; class Neko{ string name; public: Neko(){} Neko(string n):name(n){} void SetName(string n){name=n;} void Naku() const; }; void Neko::Naku() const{ cout << "名前は" << name << endl; } int main(){ int i; int num; string temp; vector <Neko> x; for(i=0;i<num;i++){ Neko *y=new Neko; x.push_back(*y); } for(i=0;i<num;i++){ cout << "名前を入力" << endl; cin >> temp; x[i].SetName(temp); } for(i=0;i<num;i++)x[i].Naku(); delete [] x;・・・※ } 廃棄(※のところ)するとき、これでは コンパイルエラーになってしまいます。 for文で回しても同じです。 どのように書けばよいのでしょうか? vectorにはポインタではなくオブジェクトが 入っていることに注意してください。

専門家に質問してみよう