2010-06-08 10 views
10

Şu anda bir 3D motor, bir fizik motoru ve bir betik dili arasındaki değerleri taşıması gereken bir oyun "motoru" üzerinde çalışıyorum. Fizik motorundan vektörleri çok sık 3D nesnelere uyguladığımdan ve hem 3B'yi hem de fizik objelerini komut dosyası aracılığıyla kontrol edebilmem gerektiğinden, bir türden bir vektörü dönüştürmek için bir mekanizmaya ihtiyacım var. vector3d<float>) diğer tipteki bir vektöre (ör. btVector3). Ne yazık ki, sınıfların/yapıların nasıl düzenlendiği konusunda hiçbir varsayımda bulunamıyorum, bu yüzden reinterpret_cast basit bir şekilde yapılmayacaktır.Üye olmayan dönüşüm işlevleri; Farklı türleri dökmek, ör. OpenGL vektörüne DirectX vektör

Yani soru şu: Şu anda döküm operatörler üye yöntemleri olması gerekiyor çünkü bu derlenmeyecektir

vector3d<float> operator vector3d<float>(btVector3 vector) { 
    // convert and return 
} 

btVector3 operator btVector3(vector3d<float> vector) { 
    // convert and return 
} 

: temelde bunu başarmak için/üye olmayan döküm yöntemiyle 'statik' bir çeşit var mı . (error C2801: 'operator foo' must be a non-static member)

cevap

5

Ben (yani onları 'operatörlere' yapma konusunda endişelenmeyin) serbest fonksiyonları bir çifti olarak bunları yazma öneririm: Söz konusu

vector3d<float> vector3dFromBt(const btVector3& src) { 
    // convert and return 
} 

btVector3 btVectorFrom3d(const vector3d<float>& src) { 
    // convert and return 
} 

void f(void) 
{ 
    vector3d<float> one; 
// ...populate... 
    btVector3 two(btVectorFrom3d(one));  
// ... 
    vector3d<float> three(vector3dFromBt(two)); 
} 
+0

Teşekkür Adam! Şu an bunu yapıyorum. Derleyicinin işi yapmasının mümkün olup olmadığını merak ediyorum. "Eğer oraya gitmek istiyorsan, önce oraya git" gibi bir şey. – sunside

+0

Anladım. Bu çözüm en doğrudan bana benzese de, başka bir cevapta başka bir olasılık daha ekledim. –

+0

Ücretsiz işlevlerle devam edin. Kapalı dönüşümler, genellikle makul olduklarında bile gitmek için kötü bir yoldur. – jalf

1

İfadende doğrudur. Tip dönüştürme operatörü statik olmayan bir üye olmak zorundadır.

// header: 
class ConvertibleVector3d; 

ConvertibleBtVector : public btVector3 
{ 
    operator ConvertibleVector3d() const; 
} 

ConvertibleVector3d : public vector3d<float> 
{ 
    operator ConvertibleBtVector() const; 
} 

//impl: 
ConvertibleBtVector::operator ConvertibleVector3d() const 
    { 
    ConvertibleVector3d retVal; 
// convert this into retVal... 
    return retVal; 
    } 

ConvertibleVector3d::operator ConvertibleBtVector() const; 
    { 
    ConvertibleBtVector retVal; 
// convert this into retVal... 
    return retVal; 
    } 

void f(void) 
{ 
    ConvertibleVector3d one; 
// ...populate... 
    ConvertibleBtVector two(one);  
// ... 
    ConvertibleVector3d three; 
    three = two; 
} 

isimleri biraz ayrıntılı ama umarım niyet açık: Eğer gerçekten dönüşüm tipi anlambilim isterseniz, uygulama kodunuzda kullanılacak bu sınıfların her uzanabilir.

Genel miras, bu sınıfların örneklerini, temel sınıfla aynı şekilde kullanabilmeniz anlamına gelir; bunlar, birbirlerinden atanabilir ve yapılandırılabilir olmaları dışında. Tabi ki bu iki sınıfı birleştirir, ancak bu sizin uygulamalarınızın zaten yapmak istediği şey gibi göründüğü için kabul edilebilir.

+0

Teşekkür (const & src Vector3D)! Diğerini cevap olarak kabul ettim.Bu daha doğal hissettiriyor, ancak kütüphane kodunu değiştirmek her zaman mümkün olmadığı için (bu durumda olduğu halde) ... vb. :) – sunside

2

Ayrıca böyle bir şablonu sarıcı sınıfını kullanabilirsiniz:

template<class V> 
class vector_cast {}; 

template<> 
class vector_cast<vector3d> { 
    const vector3d& v; 

public: 

    vector_cast(const vector3d& v) : v(v) {}; 

    operator vector3d() const { 
    return vector3d(v); 
    } 

    operator btVector3() const { 
    // convert and return 
    } 
}; 

template<> 
class vector_cast<btVector3> { 
    const btVector3& v; 

public: 

    vector_cast(const btVector3& v) : v(v) {}; 

    operator btVector3() const { 
    return btVector3(v); 
    } 

    operator vector3d() const { 
    // convert and return 
    } 
}; 

Kullanımı:

void set_origin(btVector3 v); 

// in your code: 

vector3d v; 
// do some fancy computations 
set_origin(vector_cast(v)); 

// --- OR the other way round --- // 

void set_velocity(vector3d v); 

// in your code: 

btVector3 v; 
// do some other computations 
set_velocity(vector_cast(v)); 
İlgili konular