【问题标题】:Adding method to library将方法添加到库
【发布时间】:2011-08-20 11:24:41
【问题描述】:

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

【问题讨论】:

    标签: c++ oop object sfml


    【解决方案1】:

    SFML 的 vanilla 开发包和完整的 SDK 下载都包含矢量类声明/定义文件。在 ../include/SFML/System/(在任一包中)中查找文件 Vector2.hpp 和 Vector2.inl。添加旋转功能的一种方法可能是:

    将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. ../include/Thor/Vectors/VectorAlgebra2d.hpp
    2. ../include/Thor/Detail/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 矢量类模板的相同过程,在查看了源代码并添加了一些函数(长度和点积)之后,我偶然发现了 Thor 库,它到目前为止对我的帮助很好。

    【讨论】:

      【解决方案2】:

      您所想的是所谓的“猴子补丁”或类别,在 C++ 中不可用。您可以从该类派生以添加该功能或创建friend 函数来实现您要执行的操作。 (类定义中定义为friend的函数可以访问对象的内部状态)

      【讨论】:

      • 在 .NET 中也称为“扩展方法”。而friend 将无法工作,因为他无权访问类定义。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-09
        • 2014-06-18
        • 2011-01-08
        相关资源
        最近更新 更多