2011-05-06 99 views
3

我最近一直在使用SFML在C++中編寫簡單的遊戲。這是我的問題:向庫中添加方法

在SFML庫中有一個模板類Vector2<T>(特別是我會使用Vector2f)。不幸的是,它沒有任何方法來自我旋轉,所以我想出了一個想法。但正如我寫道:

template<typename T> void Vector2<T>::Rotate(float a); 

編譯器說,我不能做這樣的事情:

printable.h:31:53: error: no ‘void sf::Vector2<T>::Rotate(float)’ member function declared in class ‘sf::Vector2<T>’ 

是否可以添加自定義方法也是這樣嗎?還是應該將Vector2f包裝到我自己的課堂中?

回答

0

你在想什麼叫做「猴子修補」或類別,並且在C++中不可用。您可以從該類派生以添加該功能或創建一個函數來實現您正在嘗試執行的操作。 (在類定義中定義爲friend的函數可以訪問對象的內部狀態)

+1

它也被稱爲.NET中的「擴展方法」。而'friend'將不起作用,因爲他無法訪問類定義。 – 2011-05-06 20:38:06

0

編譯器抱怨是因爲您試圖實現未在類聲明中聲明的函數。如果您有權訪問類聲明,那麼您可以將此函數添加到聲明中,然後按照您現在要做的那樣定義該函數。

1

SFML的vanilla開發包和完整的SDK下載都包含向量類聲明/定義文件。在文件Vector2.hpp和Vector2.inl中查找../include/SFML/System/(在任一軟件包中)。添加您的旋轉功能的一種方法是:

添加rotate方法的類聲明中Vector2.hpp:

...stuff... 

template <typename T> 
class Vector2 
{ 
public : 

.... 

void Rotate(T angle); 

.... 

}; 

然後在vector2.inl定義的方法(按照約定):

template <typename T> 
void Vector2<T>::Rotate(T angle) { 
     ...your implementation here... 
} 

修改Vector2類的另一種方法是使用quite nifty, SFML-based Thor library中的擴展向量數學函數,該函數包含Rotate函數。最小(未改變的)文件,你從雷神SDK需要利用自己的2D矢量職能是:

  1. ../include/Thor/Vectors/VectorAlgebra2d.hpp
  2. ../include/雷神/詳細信息/ VectorAlgebra2D.inl
  3. ../include/Thor/Math/Trigonometry.hpp
  4. ../src/Trigonometry.cpp

隨着項目目錄中的那些文件,你可以旋轉一個sf :: Vector做這樣的事情:

#include <iostream> 
#include <SFML/Graphics.hpp> 
#include "VectorAlgebra2D.hpp" 

.... 

sf::Vector2f rotate_THIS(10.0f,10.0f); 
thor::Rotate(rotate_THIS, 180.0f); //pass by reference 

std::cout << "(" << rotate_THIS.x << ", " << rotate_THIS.y << ")" << std::endl; 

sf::Vector2f rotated = thor::RotatedVector(rotate_THIS, 180.0f); //returns object 

std::cout << "(" << rotated .x << ", " << rotated .y << ")" << std::endl; 

.... 

其輸出(可預見):

(-10,-10) 
(10,10) 

我只是通過無需修改某個項目的SFML向量類模板的同樣的過程去了,和周圍的源戳,並添加在數後功能(長度和點積),我偶然發現了托爾圖書館,這對我來說目前服務很好。