#目的
C++でのゲーム制作をしています。
UnityにあるVector2,Vector3構造体の真似をして
自分で同じような構造体を作ろうとしています。
#質問
Unityでは
Vector3 = Vector2; のように
Vector3とVector2の異なる構造体同士での+-*/の演算や代入ができますが、
どのように実装するのでしょうか。
#試したができなかったこと
(Vector3.hに書くとき)
型変換関数の実装
C++
1//Vector3.h 2operator Vector2(); //error C2833: 'operator Vector2' は演算子または型指定子のどちらでもありません。
関数で変換する
C++
1//Vector3.h 2Vector2 ToVector2(); //error C3646: 'ToVector2': 不明なオーバーライド指定子です 3
#気づいたこと
両方の.hで互いにインクルードを行っているため問題が起きているようです。
片方の.hでもう片方へのインクルードをやめるとビルドが通ります。
ですがこれでは、双方向の型変換ができなくなってしまいます。
#コード
C++
1//Vector3.h 2#pragma once 3#include "Vector2.h" 4 5struct Vector3 6{ 7 union 8 { 9 float v[3]; 10 struct 11 { 12 float x; 13 float y; 14 float z; 15 }; 16 }; 17 18 19 static const Vector3 zero; 20 static const Vector3 right; 21 static const Vector3 left; 22 static const Vector3 up; 23 static const Vector3 down; 24 static const Vector3 forward; 25 static const Vector3 back; 26 27 Vector3(); //全要素を0.0fとしたVector3を作成します 28 Vector3(float); //全要素を引数値としたVector3を作成します 29 Vector3(float, float, float); //引数xyzを成分としたVector3を作成します 30 31 float DistanceToPoint(Vector3); //pointへの距離を返します 32 float Magnitude(); //ベクトルの長さを返します 33 Vector3 Normalized(); //このベクトルの単位ベクトルを返します 34 void Normalize(); //このベクトルを単位ベクトルに直します 35 36 //それぞれの要素同士で演算を行います 37 Vector3 operator+(Vector3); 38 Vector3 operator-(Vector3); 39 Vector3 operator*(Vector3); 40 Vector3 operator/(Vector3); 41 Vector3 operator+=(Vector3); 42 Vector3 operator-=(Vector3); 43 Vector3 operator*=(Vector3); 44 Vector3 operator/=(Vector3); 45 46 //全ての要素と演算を行います 47 Vector3 operator=(float); 48 Vector3 operator+(float); 49 Vector3 operator-(float); 50 Vector3 operator*(float); 51 Vector3 operator/(float); 52 Vector3 operator+=(float); 53 Vector3 operator-=(float); 54 Vector3 operator*=(float); 55 Vector3 operator/=(float); 56};
C++
1//Vector2.h 2#pragma once 3 4#include "Vector3.h" 5 6struct Vector2 7{ 8 union 9 { 10 float v[2]; 11 struct 12 { 13 float x; 14 float y; 15 }; 16 }; 17 18 static const Vector2 zero; 19 static const Vector2 right; 20 static const Vector2 left; 21 static const Vector2 up; 22 static const Vector2 down; 23 24 Vector2(); //全要素を0.0fとしたVector2を作成します 25 Vector2(float num); //全要素を引数値としたVector2を作成します 26 Vector2(float x, float y); //引数xyを成分としたVector2を作成します 27 28 float DistanceToPoint(Vector2 point); //pointへの距離を返します 29 float Magnitude(); //ベクトルの長さを返します 30 Vector2 Normalized(); //このベクトルの単位ベクトルを返します 31 void Normalize(); //このベクトルを単位ベクトルに直します 32 33 //同じ要素同士で演算を行います 34 Vector2 operator+(Vector2); 35 Vector2 operator-(Vector2); 36 Vector2 operator*(Vector2); 37 Vector2 operator/(Vector2); 38 Vector2 operator+=(Vector2); 39 Vector2 operator-=(Vector2); 40 Vector2 operator*=(Vector2); 41 Vector2 operator/=(Vector2); 42 43 //全ての要素と演算を行います 44 Vector2 operator=(float); 45 Vector2 operator+(float); 46 Vector2 operator-(float); 47 Vector2 operator*(float); 48 Vector2 operator/(float); 49 Vector2 operator+=(float); 50 Vector2 operator-=(float); 51 Vector2 operator*=(float); 52 Vector2 operator/=(float); 53}; 54
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/03 10:10