こんにちは。
色々方法は考えられます。
まずは、LouiS0616さんが書かれているように、test()関数の引数として渡す方法です。
次に、Playerクラスの多くのメンバ関数は恐らくMapをアクセスするでしょうから、Playerクラスのコンストラクタで渡すことも考えられます。
最後に、Mapは名前からしてPlayerクラス以外の多くのクラスもアクセスしそうなので、思い切ってグローバル変数にするのも手です。
ただ、生配列は要素数のハンドリングが面倒なので、std::vector等を使うと楽できますよ。(固定長配列ならstd::arrayでも十分ですが、最もよく使われるstd::vectorから学ぶことがお薦めです。)
std::vectorを使い、コンストラクタで渡すなら以下のイメージです。
C++
1#include <iostream>
2#include <vector>
3
4class Map
5{
6public:
7 // コンストラクタを定義していないので、デフォルト・コンストラクタ(=引数のないコンストラクタ)が
8 // コンパイラにより自動生成されます。
9
10
11 void test(int x)
12 {
13 std::cout << "Map::test(" << x << ")\n";
14 }
15};
16typedef std::vector<Map> MapList;
17
18class Player
19{
20 MapList& mMapList; // これは参照です。参照先の「変更」が不可能なポインタのようなもの
21public:
22 Player(MapList& iMapList) : mMapList(iMapList) // この記述は「初期化子リスト」です。
23 { }
24
25 void main()
26 {
27 for(int i=0;i<10;i++)
28 mMapList[i].test(i*2);
29 }
30};
31
32int main()
33{
34 MapList map{10}; // Mapのデフォルト・コンストラクタで生成されたMapオブジェクトを10個確保する
35 Player pl(map);
36
37 pl.main();
38}
初期化子リストについては、2つの異なった意味があるので要注意です。上記のケースは、ここが分かりやすそうです。
なお、参照は変更できない(代入文で代入できない)のですが初期化はできます。なので初期化子リストで初期化します。
もう一つはC++11で標準ライブラリに追加されたクラス・テンプレート(std::initializer_list)ですが、こちらはまだ下手に見ない方が良いと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/19 15:57