関数引数でクラスを作成し受け渡す機能

このQ&Aのポイント
  • 関数やメソッドの呼び出し引数の中でクラスなどを一時定義して受け渡す仕組みがありますか?
  • Javaにはこのような機能があると記憶していますが、C++にも存在するのでしょうか?
  • 例えば、以下のようにクラスを一時定義して関数に渡す機能があると便利であると思っています。
回答を見る
  • ベストアンサー

関数の引数でクラスを作成して受け渡す機能について

C++に以下のような機能はありますか? ・関数やメソッドの呼び出し引数の中でクラスなどを一時定義してそれを受け渡す仕組み 確か、Javaにこんなのがあったと記憶していますが、C++にはあるのでしょうか? ↓は概念的なものですので正しいコードではありません。 大雑把なコードにすると↓のような感じの機能なのですが名前が分かりません・・。 名前とその仕組みがあればそれについて教えていただけたらと思います。 class Test_c { public:   int t;   Test_c( int x ){     t = x;   } } ; void test( Test_c tc ){ } int main(){   test( new Test_c( 10 ) ); }

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

  • ベストアンサー
  • BearCave
  • ベストアンサー率20% (189/909)
回答No.1

できますよ。ただし、「new」は不要です。 test(Test_c(10)); 一応、「new」を使った例も載せておきます。「new」するとヒープメモリにクラスのインスタンスが確保されるので、使い終わったらdeleteする必要があります。 void test(Test_c* tc) {} // 関数はポインタを引数とする int main() {  Test_c* tc = new Test_c(10);  test(tc);  delete tc; }

amazontester
質問者

お礼

回答ありがとうございます。とても分かりやすかったです。 質問ついでで恐縮ですが、これはクラス以外にも例えば構造体などでも 可能でしょうか? クラスに関してはできたのですが、構造体ではできなかったもので・・。 やはりコンストラクタなどが関係しているのでしょうか・・・。

その他の回答 (1)

  • BearCave
  • ベストアンサー率20% (189/909)
回答No.2

>質問ついでで恐縮ですが、これはクラス以外にも例えば構造体などでも可能でしょうか? 構造体って「struct」のことですよね?もちろん可能です。C++では、classとstructに差はありません。(デフォルトのメンバーがprivateかpublicかの違いだけです。) 質問に記述されているコードの「class」の部分を「struct」に変換するだけで動くはずですよ。

amazontester
質問者

お礼

なるほど!ありがとうございました!!

関連するQ&A

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

    既出、または基礎の質問でしたらすみません。 ここでも他の検索エンジンでも見つけられなかったので。。。 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がうまく動かない理由がわかりません。。。 出力引数にクラスはとれないのでしょうか?? よろしくお願いします。

  • 引数に二重配列のある関数について

    void calc(int *a,int b,int c){ a[0]=b+c; a[1]=b-c; } void main(void){ int x[2]; int y=2,z=5; calc(x,y,z); printf("x[0]=%d,x[1]=%d\n",x[0],x[1]); } 上のように引数が普通の配列の関数ならできるのですが, 引数が下のような多重配列になるとエラーが出てしまいできません。 void keisan(int **a,int b,int c){ a[0][0]=b+c; a[0][1]=b-c; a[1][0]=b*c; a[1][1]=b/c; } void main(void){ int x[2][2]; keisan(x,6,2); printf("x[0][0]=%d,x[0][1]=%d\n",x[0][0],x[0][1]); printf("x[1][0]=%d,x[1][1]=%d\n",x[1][0],x[1][1]); } 引数に多重配列を使った場合の関数の作り方について教えてください. お願いいたします.

  • 関数の引数表記なしについて

    はじめまして。C言語初心者です。 質問させてください。 関数を宣言して引数を表記しないで使用することは可能なのでしょうか? またどのような場合に使用するのでしょうか? 例として以下コードになります。 ----------------------- #include<stdio.h> int test1(int a); void test2(int b); void main(){ int i = 0; int j = 0;       //この部分 i = test1; printf("%d\n", i);        //この部分 j = test2; printf("%p\n", j); } int test1(int a){ return a + 1; } void test2(int b){ printf("test"); } --------------------------- 出力結果を見ると関数のアドレスが帰ってくるように思われますが、詳細が分かりません。 詳しい方がいらしましたら教えてください。 宜しくお願いいたします。

  • 参照型の変数をポインタ引数を持つ関数に引数を書く方法

    C++の参照を使って以下のソースを試したのですが、 memmoveの引数のところでエラーが出ます。 memmoveの引数はポインタ型で合いません。 実体コピーしたい場合、どのようにすればよいのでしょうか? const AA &aとすれば、a自体が関数内で書き換わる心配がないので、 C++の参照型は、ポインタより安全と理解しているのですが その認識は間違っていないでしょうか? struct aa{ int x; int y; }AA; void test(AA &a) { AA b; memmove(b, a, sizeof(AA)); } void main(){ AA c; test(c); }

  • 関数の引数をvoid*でキャストする

    最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。 例えば、 func ( (void*) p ); こういうことです。 私の知っている知識では、 void* と 任意の型のポインタは キャストなしに相互に代入可能です。 関数の引数でも、キャストは要らないものだと思っていました。 そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・ 違うのでしょうか。処理系によるとか。 逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。 下のプログラムは、関数byte_orderの引数の型はvoid*ですが、int型へのポインタ( &a )を設定しています。私の環境では、コンパイルエラーも警告もないし、動作も正常です。 #include <stdio.h> #include <string.h> void byte_order(void *vp) { char char_array[4]; strncpy(char_array, vp, 4); printf("出力します:%x %x %x %x\n", char_array[0], char_array[1], char_array[2], char_array[3]); } int main(void) { int a = 0x12345678; byte_order(&a); return 0; } このプログラムは単なる一例であって、質問はバイトオーダに関するものではありません。 また、C言語の質問であって、C++ではありません。

  • 配列を引数にするとき

    ↓のようなメソッドのある時に public void method(int[] arr){} ↓のようには実行出来ると思うのですが、 int[] a = {1,2,3}; method(a); 引数に入れる時に、直接値を入れられないでしょうか? イメージ的には、 method({1,2,3}); みたいに。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 関数の引数にSTLを使う

    こんにちは。C++の勉強を最近始めました。 メンバ関数の引数に、STL(queue)を使おうとしています。 以下のように、参照にして使おうと思っています。 int test01::method(queue<int>& q) { return 0; } ですが、コンパイルしようとすると、 「識別子 'queue' がシンタックスエラーを起こしました。」 と言われてエラーになってしまいます・・・。 (他の箇所でqueueを使っていますが、そこではエラーは出ないので、 ヘッダファイルや名前空間はちゃんと指定できていると思います) STLに関する情報を集めてみたのですが、 引数にして使った例を見つけることができませんでした。 シンタックスエラーなので、文法や構文などが正しくないのだと思うのですが、 関数の引数にそもそもSTLを指定できないのか、 コーディングの仕方が間違っているのか、判断ができません。 どのようにしたら、引数に指定できるのでしょうか? ご存知の方がいらしたら、おしえていただきたいです。 よろしくおねがいします。

  • 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言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • javaのクラスなど

    現在次のようなクラスを作成していて、自分なりに作ってはみたもののうまく分かりません。 どこが間違っていてどのように修正したらよいのか、詳しく教えてください。 9と10は分かりませんでした。 (1) 次に示す内容を満たすバー(Bar)クラスを作成せよ。 1. バーの右端のx座標(=バーの長さ)、バーの名前を扱う2つのprivateなインスタンス変数を持つ。 2. バーの総数を扱うprivateなクラス変数を持つ。ただし、 ここでいう総数とは、(1)コンストラクタで作成したもの、(2)代入操作で作成したもの、の両方を含む。 3. 引数無しのコンストラクタが呼び出されてバーオブジェクトが作成されると、そのバーのx座標は0以上400未満でランダムに決定され、名前は文字「A」とランダムに決定された0以上10000未満の整数が連接されたものに決定される。 4. バーのx座標を設定するインスタンスメソッドを持つ。 5. バーの名前を設定するインスタンスメソッドを持つ。 6. バーのx座標を取得するインスタンスメソッドを持つ。 7. バーの名前を取得するインスタンスメソッドを持つ。 8. 作成されたバーの総数を取得するクラスメソッドを持つ。 9. 作成されたバーの総数を1増やすクラスメソッドを持つ。 10. 作成されたバーの総数を1減らすクラスメソッドを持つ。 こちらが作ってみたものです。 class Bar{ private int x; private String name; private int count; private Bar(){ x=0; count=0; name=""; } public void Bar(){ x = (int)(Math.random()*400); name = "A" + (int)(Math.random()*10000); } public void setBar(int bx){ x=bx; } public void setName(String nm){ name=nm; } public void getX(int bx){ } public void getName(String nm){ } public void getCount(int c){ } }

    • ベストアンサー
    • Java