実現したいこと
getterを利用せずにPlayer::isInWorld()
を実装したい。(可能なら)
前提
「アクセッサ書く実装は真のカプセル化ではない」、「本番の開発でgetterを書くことは99%ない」などの記事や動画を拝見させていただきました。そこで示されている例題などは納得しました。アウトプットのために、自分でもgetterを使わずにクラス設計できるか試してみました。
発生している問題・エラーメッセージ
そこで、プレイヤーが世界(ある範囲)の中に存在するかしないか、というメンバ関数を実装しようとしました。直面した問題が、「座標クラス(Point)のデータメンバにgetterを書かないと範囲内かどうか比較できないのでは?」というものです。
該当のソースコード
c++
1#include <iostream> 2 3// 座標(x,y) 4class Point 5{ 6public: 7 Point(int x = 0, int y = 0) 8 { 9 m_x = x; 10 m_y = y; 11 } 12 13private: 14 int m_x; 15 int m_y; 16}; 17 18 19// 2次元世界(ただの四角形) 20class World 21{ 22public: 23 World(Point start = {0, 0}, Point end = {640, 480}) 24 { 25 m_start = start; 26 m_end = end; 27 } 28 29private: 30 Point m_start; // 始点 31 Point m_end; // 終点 32}; 33 34 35// プレイヤー 36class Player 37{ 38public: 39 Player(Point point = {0, 0}) 40 { 41 m_point = point; 42 } 43 44 // プレイヤーが世界の範囲内に存在するか? 45 bool isInWorld(World world) 46 { 47 //////////////////////////////////// 48 // アクセッサを使わずに実装できるか? 49 //////////////////////////////////// 50 51 return true; 52 } 53 54private: 55 Point m_point; 56}; 57 58 59int main(void) 60{ 61 Player player = {{20, 30}}; // 座標(20,30) 62 World world; // (0,0)..(640,480) 63 64 // プレイヤーは世界の範囲内にいる? 65 bool exist = player.isInWorld(world); 66 67 return 0; 68} 69
試したこと
getterを書いていいなら単純な座標比較で可能でした。getterを書かずに実装はできませんでした。
なぜPlayerクラスに実装しようとしたのか
google翻訳で「プレイヤーは世界の中にいる」を翻訳したら"the player is in the world"と翻訳されたので、主語であるプレイヤークラスに実装することにしました。
補足情報(FW/ツールのバージョンなど)
コンパイラ: g++

回答1件
あなたの回答
tips
プレビュー