ã¬ã¬ã·ãŒç¬¬6ç« ïŒæŒç®åãªãŒããŒããŒããšå€ãªããžã§ã¯ã
æ°åŒéãã«åŒŸéãäœçœ®ãèšè¿°ïŒC++ã«ãããæ°åŠã¯ã©ã¹ãšæŒç®åã®æµå
Cèšèªã®æ§é äœã§ã¯ã座æšãé床ã®å ç®ã« `Vec2_Add(&pos, &vel, &out);` ã®ãããªé¢æ°åŒã³åºããå€çšããã³ãŒãã®ãã¹ããåŒæ°é åºã®ãã°ã«æ©ãŸãããŠããŸãããC++ã®åŒ·åãªæ©èœãæŒç®åãªãŒããŒããŒãïŒoperator+, operator*, operator+=ïŒããæŽ»çšããããšã§ãæ°åŠã®å
¬åŒéãã«ç©çæŒç®ãçŽæçã«èšè¿°ããææ³ãç¿åŸããŸããããã«ãäºæãã¬æé»ã®å倿ãé²ã explicit ããŒã¯ãŒããfriend 颿°ã«ããã¹ããªãŒã åºåïŒstd::cout << vïŒãå€ãªããžã§ã¯ãèšèšã®äœæ³ããã¹ã¿ãŒããŸãã
L6.1 Cèšèªã®é¢æ°å°ç vs C++æŒç®åãªãŒããŒããŒã
`Vec2_Add(&pos, Vec2_Scale(&vel, dt, &tmp), &pos);` ã«çµæ¢ç¬Šãæã€ïŒé«æ ¡æ°åŠã®æ°åŒãã®ãŸãŸ `pos += vel * dt;` ãšæžããå§åçæ©æµãšèšèšã®å¿
ç¶æ§ãåŠã³ãŸãã
ð§ ãã³ã®ã³å
茩
ãã³å
çïŒã€ã³ããŒããŒã®åŒŸéèšç®ã§ãèªæ©ã«åãã£ãŠé£ã¶èªå°ããµã€ã«ãããæç¶ã«åºããæ¡æ£åŒŸããäœãããšããããCèšèªã¹ã¿ã€ã«ã®èšç®é¢æ°ã§ç»é¢ãåãå°œããããŠé ãç Žè£ãããã§ãâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ã©ãã©ãâŠâŠã»ã»ãïŒ`Vec2_Add(&targetPos, Vec2_Normalize(Vec2_Sub(&p, &e, &t1), &t2), &res);` ãïŒèŠäºãªãŸã§ã®ãCèšèªãã¹ãå°çããããªãæ¬åŒ§ãã©ãã«å¯Ÿå¿ããŠããã誰ãèªããïŒ
ð§ ãã³ã®ã³å
茩
çŽã®ããŒãã«æžããšã㯠`pos = pos + vel * dt;` ã£ãŠãµã©ããšæžããã®ã«ãããã°ã©ã ã«ãªããšã©ãããŠãããªã«éããªããã§ããããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ã¬ããïŒããã§ç»å Žããã®ãC++ã®ç骚é ãæŒç®åãªãŒããŒããŒãïŒOperator OverloadingïŒãããïŒãŠãŒã¶ãŒå®çŸ©ã®ã¯ã©ã¹ã§ãã£ãŠããint ã float ãšå
šãåãããã« `+`, `-`, `*`, `+=` ãçŽæ¥äœ¿ã£ãŠæ°åŒéãã«èšè¿°ã§ããããã«ããéæ³ãªããããïŒ
L6.2 æŒç®åãªãŒããŒããŒãã®éåïŒåç
§è¿ãã»constã»explicit
ã䟿å©ã ããäœã§ããªãŒããŒããŒãããŠè¯ããããã§ã¯ãããŸããïŒåç
§è¿ããšå€è¿ãã®éããæé»å€æãé²ã explicit ã®é²æ³¢å €ãåŠã³ãŸãã
ð§ ãã³ã®ã³å
茩
å
çã`operator+` 㯠`Vec2`ïŒå€ïŒãè¿ããŠããã®ã«ã`operator+=` 㯠`Vec2&`ïŒåç
§ïŒãè¿ã㊠`return *this;` ããŠããŸãããã®éãã¯äœãªãã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
çŽ æŽããã芳å¯çŒããïŒ`a + b` ã¯ãæ°ããèšç®çµæããäœãããæ°ãããªããžã§ã¯ãã®ã³ããŒïŒå€ïŒãè¿ãããããã`a += b` ã¯ããã§ã«ååšãã a èªèº«ãæžãæããããããç¡é§ãªã³ããŒãé¿ã㊠`a` ãã®ãã®ã®åç
§ãè¿ãã®ãC++æšæºã®æãªãããïŒ
ð§ ãã³ã®ã³å
茩
åç
§ãè¿ãã°ã`(a += b) += c;` ã¿ããã«é£éïŒChainingïŒãã§ããããã§ããïŒ
ð»ââïž ã·ãã¯ãå
ç
ãã®éãïŒãããŠãã1ã€ã®éèŠãã©ããããæé»ã®å倿ããããåäžåŒæ°ã®ã³ã³ã¹ãã©ã¯ã¿ã«ã¯å¿
ã `explicit` ãä»ãããšãæå³ããªãå倿ã§è¬ã®ãã°ãèžãããšã«ãªããïŒ
L6.3 friend 颿°ãšã¹ããªãŒã åºåïŒstd::cout << vecïŒ
ãªã `std::cout << v;` ã¯ã¡ã³ã颿°ãšããŠæžããªãã®ãïŒäºé
æŒç®åã®å·ŠèŸºãšå³èŸºã®åé¢ä¿ãããã³ `friend` 颿°ã®æ£ãã䜿ãéãè§£æããŸãã
ð§ ãã³ã®ã³å
茩
å
çïŒãã¯ãã«ã®åº§æšãç»é¢ã«ãããã°åºåãããã®ã§ã`std::cout << pos;` ã£ãŠæžããããã«ãããã§ãïŒã§ãã`std::cout` åŽã®ã¯ã©ã¹ïŒstd::ostreamïŒãæžãæããããã«ã¯ãããªãã§ãããâŠâŠïŒ
ð»ââïž ã·ãã¯ãå
ç
ãããªãããïŒã¡ã³ã颿°ãšããŠå®çŸ©ãããšã巊蟺ã®ãªããžã§ã¯ãïŒthisïŒãã«å±ãã颿°ã«ãªããããã `std::cout << v` ã®å·ŠèŸºã¯æšæºã©ã€ãã©ãªã® `std::ostream` ãããããã§ãéã¡ã³ã颿°ããšããŠæŒç®åããªãŒããŒããŒãããã¯ã©ã¹å
éšã®ãã©ã€ããŒã倿°ã«ã¢ã¯ã»ã¹ãããããã«ãfriend 宣èšãã䜿ãã®ããïŒ
ð Vec2.h
#pragma once
#include <iostream>
class Vec2 {
private:
float x_;
float y_;
public:
// ããã©ã«ãïŒåº§æšã³ã³ã¹ãã©ã¯ã¿
Vec2(float x = 0.0f, float y = 0.0f) : x_(x), y_(y) {}
// åäžåŒæ°ïŒæ£æ¹åœ¢ãçåã¹ã±ãŒãªã³ã°çšïŒæé»å€æé²æ¢ïŒ
explicit Vec2(float scalar) : x_(scalar), y_(scalar) {}
// ã²ãã¿ãŒ
float getX() const { return x_; }
float getY() const { return y_; }
// ç®è¡æŒç®å
Vec2 operator+(const Vec2& rhs) const {
return Vec2(x_ + rhs.x_, y_ + rhs.y_);
}
Vec2 operator-(const Vec2& rhs) const {
return Vec2(x_ - rhs.x_, y_ - rhs.y_);
}
Vec2 operator*(float scalar) const {
return Vec2(x_ * scalar, y_ * scalar);
}
// è€å代å
¥æŒç®åïŒé«éãªåç
§è¿ãïŒ
Vec2& operator+=(const Vec2& rhs) {
x_ += rhs.x_;
y_ += rhs.y_;
return *this;
}
Vec2& operator-=(const Vec2& rhs) {
x_ -= rhs.x_;
y_ -= rhs.y_;
return *this;
}
Vec2& operator*=(float scalar) {
x_ *= scalar;
y_ *= scalar;
return *this;
}
// ç䟡æ¯èŒæŒç®å
bool operator==(const Vec2& rhs) const {
return (x_ == rhs.x_) && (y_ == rhs.y_);
}
bool operator!=(const Vec2& rhs) const {
return !(*this == rhs);
}
// ã¹ããªãŒã åºå friend 宣èš
friend std::ostream& operator<<(std::ostream& os, const Vec2& v);
};
// ã¹ããªãŒã åºåæŒç®åã®éã¡ã³ãå®è£
inline std::ostream& operator<<(std::ostream& os, const Vec2& v) {
os << "(" << v.x_ << ", " << v.y_ << ")";
return os;
}
ð Weapon.cpp
#include "Vec2.h"
#include <vector>
#include <cmath>
// æç¶æ¡æ£ã·ã§ããïŒ3WAYïŒã®åŒŸéãã¯ãã«çæ
std::vector<Vec2> createTripleShot(const Vec2& playerPos, float speed) {
std::vector<Vec2> bulletVelocities;
// åæ¹ïŒäžåãïŒ
bulletVelocities.push_back(Vec2(0.0f, -speed));
// å·Šæãæ¡æ£åŒŸïŒ-15床ïŒ
bulletVelocities.push_back(Vec2(-speed * 0.3f, -speed * 0.95f));
// å³æãæ¡æ£åŒŸïŒ+15床ïŒ
bulletVelocities.push_back(Vec2(speed * 0.3f, -speed * 0.95f));
return bulletVelocities;
}
void updateBullets(std::vector<Vec2>& positions, const std::vector<Vec2>& velocities, float dt) {
for (size_t i = 0; i < positions.size(); ++i) {
// æŒç®åãªãŒããŒããŒãã®ãããã§ã極ããŠçŽæçãã€é«éã«äœçœ®æŽæ°ïŒ
positions[i] += velocities[i] * dt;
}
}
ð ç解床ãã§ãã¯ã¯ã€ãº
Q1. è€å代å
¥æŒç®åïŒoperator+=ïŒã®æ»ãå€ã®åãšããŠãC++ã®æšæºèŠåŸã«æãåãããã®ã¯ã©ãã§ããïŒ
- 1. Vec2 ïŒæ°ãããªããžã§ã¯ãã®ã³ããŒãå€ã§è¿ãïŒ
- 2. Vec2& ïŒèªèº«ãžã®åç
§ *this ãè¿ãïŒ
- 3. void ïŒäœãè¿ããªãïŒ
- 4. const Vec2& ïŒæžãæãäžå¯èœãª const åç
§ãè¿ãïŒ
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒVec2& ïŒèªèº«ãžã®åç
§ *this ãè¿ãïŒ
operator+= ã¯èªèº«ã倿ŽããæŒç®åã§ãããããç¡é§ãªãªããžã§ã¯ãã³ããŒãé¿ããŠèªèº«ãžã®åç
§ïŒVec2&ïŒãè¿ããæ«å°Ÿã§ return *this; ãšæžãã®ãC++ã®æ
£äŸã§ããããã«ãã (a += b) += c; ã®ãããªé£éåŒã³åºããå¯èœã«ãªããŸãã
Q2. åäžåŒæ°ãåãåãã³ã³ã¹ãã©ã¯ã¿ã« explicit ããŒã¯ãŒããä»äžããæå€§ã®ç®çã¯äœã§ããïŒ
- 1. ã¡ã¢ãªãããŒãé åã§ã¯ãªãã¹ã¿ãã¯é åã«åŒ·å¶é
眮ãããã
- 2. ã³ã³ãã€ã©ãããã°ã©ãã®æå³ããªãæé»ã®å倿ïŒImplicit ConversionïŒãè¡ãã®ã鲿¢ãããã
- 3. 颿°ãã€ã³ã©ã€ã³å±éãããªãããã«ãããã
- 4. 芪ã¯ã©ã¹ã®ä»®æ³é¢æ°ããŒãã«ãäžæžããããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒã³ã³ãã€ã©ãããã°ã©ãã®æå³ããªãæé»ã®å倿ïŒImplicit ConversionïŒãè¡ãã®ã鲿¢ãããã
explicit ãä»ããªããšãäŸãã° void attack(Vec2 target); ãšãã颿°ã« attack(10.0f); ãšæž¡ããéãã³ã³ãã€ã©ãåæã« Vec2(10.0f) ã«å€æããŠåŒã³åºããŠããŸããé倧ãªãã°ã®åå ã«ãªããŸããexplicit ã¯æå³çãªå倿ã®ã¿ãèš±å¯ããå®å
šè£
眮ã§ãã
Q3. Vec2 ã¯ã©ã¹ã®ã¡ã³ã颿°ãšããŠäºé
æŒç®å operator+ ãå®çŸ©ããå Žåã颿°ã®åŒæ°ã¯éåžžããã€ã«ãªããŸããïŒ
- 1. 0å
- 2. 1å ïŒå·ŠèŸºã¯æé»ã® this ãã€ã³ã¿ãšãªããããå³èŸºã®ã¿ãåãåãïŒ
- 3. 2å ïŒå·ŠèŸºãšå³èŸºã®äž¡æ¹ãåãåãïŒ
- 4. 3å ïŒåºåå
ãã€ã³ã¿ãå«ããŠ3åïŒ
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒ1å ïŒå·ŠèŸºã¯æé»ã® this ãã€ã³ã¿ãšãªããããå³èŸºã®ã¿ãåãåãïŒ
äºé
æŒç®åãã¡ã³ã颿°ãšããŠå®çŸ©ããå Žåã巊蟺ã®ãªããžã§ã¯ãèªèº«ã this ãšããŠæé»ã«æž¡ããããããæç€ºçãªåŒæ°ã¯å³èŸºïŒconst Vec2& rhsïŒã®1åã ãã«ãªããŸãã
Q4. std::cout << v; ã®ããã«ãèªäœã¯ã©ã¹ãã¹ããªãŒã åºåæŒç®åã§åºåã§ããããã«ãããå Žåããªã operator<< ã¯ã¡ã³ã颿°ã§ã¯ãªã friendïŒãŸãã¯éã¡ã³ãïŒé¢æ°ãšããŠå®çŸ©ããå¿
èŠãããã®ã§ããïŒ
- 1. std::cout 㯠const ãªããžã§ã¯ãã§ãããã¡ã³ã颿°ãåãä»ããªããã
- 2. æŒç®åã®å·ŠèŸºãèªã¯ã©ã¹ã§ã¯ãªããæšæºã©ã€ãã©ãªã® std::ostream ã ãã
- 3. friend 颿°ã«ããªããšã³ã³ãã€ã«éåºŠãæ¥µç«¯ã«èœã¡ããã
- 4. C++03 ã§ã¯æŒç®åãªãŒããŒããŒããçŠæ¢ãããŠãããã
æ£è§£ãšè§£èª¬ãèŠã
æ£è§£ïŒæŒç®åã®å·ŠèŸºãèªã¯ã©ã¹ã§ã¯ãªããæšæºã©ã€ãã©ãªã® std::ostream ã ãã
äºé
æŒç®åãã¡ã³ã颿°ã«ããå Žåã巊蟺ã®åããã®ã¯ã©ã¹èªèº«ã§ããå¿
èŠããããŸããstd::cout << v ã®å·ŠèŸºã¯ std::ostream åã§ãããç§ãã¡ãæšæºã©ã€ãã©ãªã® std::ostream ã¯ã©ã¹ã«ã¡ã³ã颿°ã远å ããããšã¯ã§ããªããããéã¡ã³ã颿°ãšããŠå®çŸ©ãããã©ã€ããŒã倿°ãžã®ã¢ã¯ã»ã¹ã friend ã§èš±å¯ããŸãã
ð»ââïž ã·ãã¯ãC++ã©ã ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ã·ã¹ãã
ãã©ãŠã¶ã§JavaScriptãæå¹ã«ãããšããã©ãŠã¶å
ã€ã³ããŒããŒã²ãŒã ãšãã¥ã¬ãŒã¿ãã¡ã¢ãªãããå¯èŠåãUMLã¯ã©ã¹å³ã察話å解説ãç解床ã¯ã€ãºãèµ·åããŸãã
ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ãéå§ãã â