質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

4回答

11835閲覧

C++ クラスからクラスにアクセスしたい

nicoyou

総合スコア129

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2018/12/19 15:40

編集2018/12/20 11:40

win10 VS2017
以下のようにクラス内から別のクラスへアクセスするにはどうすればいいでしょうか?
クラス関連を調べてもこれを解決できる方法を見つけられなかったので、どのように調べたら出てくるかだけでも教えていただけると嬉しいです
クラス インスタンスで検索しても見つけられませんでしたm(__)m

c++

1class Map() 2{ 3void test(int x) 4{ 5} 6} 7 89class Player() 10{ 11void main() 12{ 13for(int i=0;i<10;i++) 14map::test(1); // 左のように別クラスからアクセスしたいのですが、調べても見つけられませんでした 15} 16} 17 18main() 19{ 20Map map[10]; 21Player pl; 22 23pl.main(); // ここで上で定義した10つのマップのtestにアクセスしたい 24}

追記:
沢山のご回答ありがとうございます
現在VCを触る時間の余裕がないため、返信等行えません
3日以内には戻ってきますのでご了承くださいm(__)m

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

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

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

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

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

guest

回答4

0

引数として受け渡すようにします。

C++

1class Player() 2{ 3 void main(Map *maps, size_t size) 4 { 5 for(size_t i=0;i<size;i++) 6 maps[i].test(1); 7 } 8}

呼び出し側はこんな感じ。

C++

1pl.main(map, std::size(map));

ついでに。
生配列ではなくstd::arrayやstd::vectorを使うことをお勧めします。

投稿2018/12/19 15:54

LouiS0616

総合スコア35660

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

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

nicoyou

2018/12/19 15:57

ありがとうございます 調べてきますm(__)m
guest

0

ベストアンサー

こんにちは。

色々方法は考えられます。
まずは、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/20 03:25

Chironian

総合スコア23272

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

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

nicoyou

2018/12/23 06:38

詳細な説明ありがとうございます 頂いたサンプルを参考に少しプロジェクトを作ってみます
nicoyou

2018/12/23 19:24 編集

皆さんご回答ありがとうございました やってみたかったことはとりあえずできました また、それに関して疑問もできましたが調べても分からなければそれはまた別の質問で気候と思います ベストアンサーに関しては早さとどちらを優先すべきか悩みましたが、一番わかりやすく書いていただいたのでChironianさんを選ばさせていただきます
guest

0

直面している問題を
structと関数で書きかえてみました.概ね,以下のような感じです.
問題点が解りやすくなると思うのですが,いかがでしょうか.

仮に,これでもよくわからないようであれば,
Cの基本(変数の通用範囲とか)を先に学ばれるべきかと思います.

//構造体 struct Map { //... }; //関数 void Player_Main() { //※ここで,main()のローカル変数であるmap[10]にさわりたいのだが,どうすれば? } //main int main(void) { struct Map map[10]; //main()内のローカル変数 Player_Main(); //関数呼び出し ... }

投稿2018/12/20 02:49

fana

総合スコア11658

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

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

nicoyou

2018/12/23 06:12

これはclassどうしであってもこの二つと同じように使えるということでしょうか? ポインタで操作した場合などでも同じように使えるのでしたら大方予想はできそうです
guest

0

この方が利便性高くない?

c++

1class Player() 2{ 3 void main(Map maps) 4 { 5 Map.test(1); 6 } 7}

c++

1for(int i = 0;i < 10;i++){ 2 pl.main(map); 3}

投稿2018/12/20 01:29

stdio

総合スコア3307

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

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

nicoyou

2018/12/23 06:08

これだとメイン関数をグルグル回してしまっているのであまり好ましくありません あくまでもfps制御のもと自動で1度だけ呼ばれるような形にしたいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問