2013-06-28 243 views
0

我有一個關於循環依賴與C++模板的問題。 我有兩個模板類,Rotation3和Vector3。 旋轉保持水平和垂直旋轉,而矢量具有xy和z分量。C++模板依賴關係

我想每一類有一個構造函數其他:

Vector3<T>::Vector3(const Rotation3<T>& rot) 

和...

Vector3<T>::Rotation3(const Vector3<T>& vec) 

但是,因爲模板不能在.cpp文件放在,並且必須位於.h中,這意味着Vector3.h和Rotation3.h必須包含對方纔能使用對方的構造函數。這可能嗎?

感謝您提前給予的幫助,我對C++比較陌生,我真的很想知道有經驗的人會怎樣去設計這個。

+0

我想知道如何在地球之間進行轉換。 –

+0

爲什麼你不把他們放在同一個文件 – aaronman

+0

@BartekBanachewicz我想出了數學,那不是問題。你必須使用旋轉矩陣和其他東西。 http://en.wikipedia.org/wiki/Rotation_matrix –

回答

2

這是有點奇怪的,通過使用#include指令不接近文件的開始,但有效。包括衛兵比平時更重要。

// Vector3.hpp 
#ifndef VECTOR3_HPP_ 
#define VECTOR3_HPP_ 

template<typename T> class Rotation3; 

template<typename T> class Vector3 
{ 
public: 
    explicit Vector3(const Rotation3<T>&); 
}; 

#include "Rotation3.hpp" 

template<typename T> 
Vector3<T>::Vector3(const Rotation3<T>& r) 
{ /*...*/ } 

#endif 

// Rotation3.hpp 
#ifndef ROTATION3_HPP_ 
#define ROTATION3_HPP_ 

template<typename T> class Vector3; 

template<typename T> class Rotation3 
{ 
public: 
    explicit Rotation3(const Vector3<T>&); 
}; 

#include "Vector.hpp" 

template<typename T> 
Rotation3<T>::Rotation3(const Vector3<T>& v) 
{ /*...*/ } 

#endif 
+0

謝謝,我明白這是如何工作的。這有點奇怪,但它是我能看到的唯一途徑。謝謝,接受。 –

0

像往常一樣,你可以只聲明的東西,而且該聲明可能足以達到目的。模板的聲明與其他所有模板類似,只是省略了定義部分。

也可以在類之外定義模板類的成員函數。您可以將頭部分割爲只定義類和另一個實現函數。然後你可以將它們包括在內。

1

如果Vector3和Rotatio3都是模板,則不會發生任何事情,因爲模板直到專門化或使用(例如vector3)纔會生成對象。

您可以通過構圖或繼承創建另一個包含vector3和Rotation3的類,並根據需要使用它們。這也可以是一個模板(模板Vector3,模板Rotation3>示例)