🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2204閲覧

C++のオブジェクトの配列を関数に渡す方法が分かりません。

mmtaro000

総合スコア15

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/11/23 03:29

C++でクラスのオブジェクトを配列として宣言し、それを別の関数に渡す方法が分かりません。

C++

1sample.h 2 3class sample{ 4 public: 5 sample(void); 6 ~sample(void); 7 int test; 8 void samplefunc(void); 9} *smpl; 10

C++

1sample.cpp 2 3#include <iostream> 4#include "sample.h" 5 6using namespace std; 7 8void sample::samplefunc(void){ 9 //ここにオブジェクトのメンバであるtestを表示させたい 10} 11 12int main(void){ 13 smpl = new sample[3]; 14 for (int i = 0; i < 3; i++){ 15 smpl[i].test = i + 1; 16 } 17 18 (*smple).samplefunc(); 19 //該当のわからない場所 20 //smpleをまとめてsamplefuncに渡してsamplefunc内でcout << smpl[i] << endl;というようにしたい 21 //しかし、samplefunc内で与えられたオブジェクトの配列を要素ごとに参照する方法が分からない。 22 return 0; 23}

詳しい相談内容はソース内に記述しておりますが、main関数で要素を更新したsampleクラスのオブジェクトsmplを要素数3の配列として、各要素ののメンバをsamplefunc内で参照したい、ということです。改善方法として、main関数内でfor文を構成し、要素ごとにsamplefuncに渡せばいいというのがありますが、プログラムの構成上それがやりたくないので、それ以外の方法で解決策があれば教えていただきたいです。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/11/23 03:36

基本的には、各要素に対してメソッドを呼び出す必要がありますので、本質的にはどこかで「for文を構成し、要素ごとにsamplefuncに渡」すような方法しかありません。 「それがやりたくない」とありますが、mainに書きつけるのがよくない、ということなのでしょうか?それとも、別な箇所が問題なのでしょうか?
mmtaro000

2020/11/23 04:07

samplefunc内で再帰処理を行いたいので、mainからforで呼び出すと上手く動作してくれないんです。 他の改善法としてはtestを要素数3の配列とするくらいでしょうか?
maisumakun

2020/11/23 04:11

> samplefunc内で再帰処理を行いたいので えっと、それは「配列の他の要素も」見たいということでしょうか?でしたら、「testを要素数3の配列と」して1インスタンスに収めるのが適切、ということになります。
mmtaro000

2020/11/23 04:18

>「配列の他の要素も」見たいということでしょうか? それは配列の要素間でのやりとりがあるということをお聞きしているのでしょうか?要素間のやり取りは存在しません。オブジェクトの配列で処理した方が何かまとまっててスタイリッシュになるかなという個人的なものです笑 行いたい再帰処理は void sample::samplefunc(void){ 処理1 smpl[0].samplefunc(); 処理2 smple[1].samplefunc(); 処理3 smpl[2].samplefunc(); } という形です。
guest

回答3

0

friend関数やstaticメンバ関数を用います。

c++

1class sample{ 2 public: 3 sample(void); 4 ~sample(void); 5 int test; 6 void samplefunc(void); 7 static void samplefunc_all(sample* ary, int max); 8} *smpl;

c++

1void sample::samplefunc_all(sample* ary, int max){ 2 for(int i = 0; i < max; i++) { 3 ary[i].samplefunc(); 4 } 5} 6 7int main(){ 8 sample::samplefunc_all(smpl, 3); 9}

投稿2020/11/23 05:00

編集2020/11/23 05:06
asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mmtaro000

2020/11/23 05:10

なるほど、他の関数からfor文で要素ごとに実行するということでしょうか?
guest

0

オブジェクトの配列で処理した方が何かまとまっててスタイリッシュになるかなという個人的なものです笑

考え方がおかしいです。

sample[3]という配列自体はメソッドを持てませんので、(*smpl).samplefunc();として呼び出したインスタンスメソッドから参照可能なのは、*smpl、つまりsmpl[0]だけです。

投稿2020/11/23 04:23

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/11/23 04:25

smpl[1]へアクセスできるのはmainの中からだけですので、(配列をまとめて単なる関数やstaticなメソッドにわたすのでなければ)mainから呼ぶしかありません。
mmtaro000

2020/11/23 04:26

ということは、samplefunc内で他の要素も参照したい場合はポインタを直接操作する必要があると言ことでしょうか?
maisumakun

2020/11/23 04:29 編集

なぜそれを「インスタンスメソッドで」行いたいのでしょうか? 他のインスタンスの状態を見てそれと相互作用するメソッドを書くのならともかく、他のインスタンスのメソッドを単に呼び出すだけであれば、インスタンスメソッドは適切な置き場所ではありません。
mmtaro000

2020/11/23 04:35

難しくてあまり分からないのですが、どのように完全すればいいのでしょうか?
maisumakun

2020/11/23 04:37

「難しくてあまり分からない」のであれば、mainでそのまま書くのが必要十分かと思います。
maisumakun

2020/11/23 04:42

smplがmainのローカル変数である以上、それを処理するコードはmainに書くのが最も適切な場所です。
mmtaro000

2020/11/23 04:46

つまりmain関数から要素を指定して呼び出すということですか?mainから呼び出すとやりたい処理が行えないので、メンバ変数を配列にして管理する方が良いでしょうか?
maisumakun

2020/11/23 04:49

(元のコードが無限ループにしかならないので、やりたいことがいまいちつかめていない感じです)
mmtaro000

2020/11/23 04:56

実際は整数を引数として減算しながら再帰処理を行い、ある数値以下なら終了するという内容になっているんですけど、具体的な処理内容は私の質問内容から外れていると思ったので省略させていただきました。
maisumakun

2020/11/23 04:59

再帰処理の内容は「1インスタンスだけに収まる」ものなのでしょうか?それとも「配列の全インスタンスを相互に参照しつつ進めていく」必要があるのでしょうか? (上で「要素間のやり取りは存在しません」と書いてあったので前者だと解釈していたのですが、そうではないのでしょうか?)
mmtaro000

2020/11/23 05:09

要素間でのやり取りはないんですけど、他の要素によって得られた結果を用います。上述の再帰処理を行いたいという形です。
maisumakun

2020/11/23 06:26

asmさんの回答のように、staticメンバ関数を立ててみるのがいいかと思います。
mmtaro000

2020/11/24 04:51

検討してみます。ありがとうございます。
guest

0

ベストアンサー

C++

1#include <iostream> 2using namespace std; 3 4class sample { 5public: 6 sample(void) { } 7 ~sample(void) { } 8 int test; 9 void samplefunc(int n); 10} *smpl; 11 12void sample::samplefunc(int n) 13{ 14 if (--n > 0) samplefunc(n); // this は smpl 15 cout << "[" << n << "].test = " << this[n].test << endl; 16} 17 18int main() 19{ 20 smpl = new sample[3]; 21 for (int i = 0; i < 3; i++) 22 smpl[i].test = i + 1; 23 24 (*smpl).samplefunc(3); // smpl->samplefunc(3); と同じ 25 return 0; 26}

samplefunc で for文を使わず、再帰呼出しを使っています。
コメントをお願いします。

投稿2020/11/23 06:22

編集2020/11/24 04:26
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mmtaro000

2020/11/24 05:25

thisで参照できるのは知らなかったです。 ありがとうございます、やってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問