向库中添加方法

时间:2011-05-06 20:30:26

标签: c++ oop object sfml

我最近用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包装到我自己的类中吗?

3 个答案:

答案 0 :(得分:1)

vanilla开发包和SFML的完整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函数。 Thor SDK需要使用其最小(未更改)文件来使用其2D矢量函数:

  1. ../包括/托尔/载体/ VectorAlgebra2d.hpp
  2. ../包括/托尔/详情/ VectorAlgebra2D.inl
  3. ../包括/托尔/数学/ Trigonometry.hpp
  4. ../的src / Trigonometry.cpp
  5. 使用项目目录中的这些文件,您可以通过执行以下操作来旋转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矢量类模板的相同过程,在浏览了源代码并添加了一些函数(长度和点积)之后,我偶然发现了Thor库,到目前为止,我的表现非常好。

答案 1 :(得分:0)

您所考虑的内容称为“猴子修补”或类别,并且在C ++中不可用。您可以从该类派生以添加该功能或创建friend函数来实现您尝试执行的操作。 (在类定义中定义为friend的函数可以访问对象的内部状态)

答案 2 :(得分:0)

编译器抱怨,因为您正在尝试实现未在类声明中声明的函数。如果您可以访问类声明,那么您可以将此函数添加到声明中,然后按照您现在尝试的方式定义函数。