Çok sayıda vektör matematik işi yapıyorum ve bunun için kendi şablonumu yazdım.C++ Vektör Matematik ve OpenGL uyumlu
Gereksinimlerim vektör matematiği (toplama, çıkarma, ölçek, çapraz prod ve nokta prod) çok fazladır, ayrıca benim vektörü float [] olarak geçirebilmem gerekir, böylece openGL bunu kullanabilir.
Bir süredir bunu oldukça mutlu bir şekilde kullanıyorum, bugün bir öğretim görevlisi onu gördü ve inledi. Özellikle nefret ettiği iki şey vardı (bunlardan birini anladım), kalıtımımı kullanmam çünkü is a
stilini izlemiyordu. Ve benim dökümüm (T*)this
, elbette çözüm yolunda fazla bir şey yoktu.
: kalıtım, ben böyle benim vektörleri tasarlanmış böylece vec4 giden tarihiyle vec2 yararlanmak gerekiyor.
template<typename T>
Vector2D
{
public:
getX(), getY(), setX(), setY() ....
};
template<typename T>
Vector3D : public Vector2D<T>
{
public:
getZ(), setZ() ...
}
template<typename T>
Vector4D : public Vector3D<T>
{
public:
getW(), setW() ...
}
Bu neden kötü? ve tbh bunu nasıl geliştireceğimi göremiyorum. Ben tür tanımlamak ve bir çeşit getters ve setters sahip olmak için (istiyorum) ihtiyacım var. Ben
template<typename T, int _size>
VectorT
gibi yeniden düzenlenmiş ise benim .getX()
, .setX()
şeyler gevşek ve .at()
veya []
gibi bir şey ile değiştirmek gerekir. tbh Kullanıcı tanımalarını daha kolay hale getirmesine rağmen .getX()
'un okunabilirliğini tercih ederim.
İkincisi: Bunun neden kötü olduğunu görebilirsiniz, ama o yüzden ben uyarısı operatöre
// Defined in Vector2D<T>
operator*() { return (T*)this; }
olarak aşırı olduğunuz bir şamandıra dizi bekliyoruz OpenGL yöntemi içine bu vektörler geçebilir hale getirmek için Anladığım kadarıyla, derleyicinin, sınıfın başında üye değişkenleri x, y, z, w koyacağına dair bir garanti yoktur ve dikkatli olmasaydım, bunun yerine v-tablosunu geçebilirim. Ancak itiraf etmeliyim ki şimdiye kadar hiç sorunum olmadı.
Bunun etrafında görebilmemin tek yolu, döndürülecek bir diziyi sürdürmektir. İlk başta vektörlerle uğraşma şeklini değiştirirsem daha kolay olurdu.
Mesaj daha koddur. Operatör * nerede tanımlanır? GetX() ve setX() yöntemleri nerede? –