C++ Class implementation

C++ Class implementation

本文关键字:implementation Class C++      更新时间:2023-10-16

编辑原始问题,因为它被标记为太宽泛。如果我有一个类 Class1 的对象读取数组的值,我该如何读取类中的值,以便它可以存储并与同一类的其他对象一起使用。我尝试在下面创建一个构造函数并将值插入变量中,这是正确的方法吗?注意:我是C程序员,试图弄清楚C++世界中的事情

int main()
{
    Class1 Classobj1 = {2,3,4};
}

class Class1{
    int *a = new int[3] ;
    Class1(int *p)
    {
       for(int i=0;i<3;i++)
       {
           *a = *p;
       }
    }
};

虽然这不是一个Matrix类,而是一个简单的Vector2类,它接受floats这个类演示了如何重载operators

class Vector2 {     
public:
    union {
        float _f2[2];
        struct {
            float _x;
            float _y;
        };
    };
    inline Vector2();
    inline Vector2( float x, float y);
    inline Vector2( float *pfv );
    // Operators
    inline Vector2  operator+( const Vector2 &v2 ) const;
    inline Vector2  operator+() const;
    inline Vector2& operator+=( const Vector2 &v2 );
    inline Vector2  operator-( const Vector2 &v2 ) const;
    inline Vector2  operator-() const;
    inline Vector2& operator-=( const Vector2 &v2 );
    inline Vector2  operator*( const float &value ) const;
    inline Vector2& operator*=( const float &value );
    inline Vector2  operator/( const float &value ) const;
    inline Vector2& operator/=( const float &value );   
    inline friend Vector2 Vector2::operator*( const float &fValue, const Vector2 v2 ) {
        // Pre Multiple Vector By A Scalar
        return Vector2( value*v2._x, value*v2._y );
    } 
    inline friend Vector2 Vector2::operator/( const float &value, const Vector2 v2 ) {
        // Pre Divide Vector By A Scalar
        Vector2 vec2;
        // Math:: external class not shown here isZero() to check if value is minimally close to 0
        if ( Math::isZero( v2._x) )
            vec2._x= 0.0f;
        else
            vec2._x = value / v2._x;
        if ( Math::isZero( v2._y ) )
            vec2._y = 0.0f;
        else
            vec2._y = value / v2._y;
         return vec2;
    } 
};
inline Vector2::Vector2() :
  _x(0.0f), _y(0.0f) {  
} 
inline Vector2::Vector2( float x, float y ) :
  _x(x), _y(y) {
}
inline Vector2::Vector2( float *pv ) :
  _x( pv[0] ), _y( pv[1] ) {
}
inline Vector2 Vector2::operator+() const {
    return *this; // Unary + Operator
} 
inline Vector2 Vector2::operator+( const Vector2 &v2 ) const {
    // Binary + Take This Vector And Add Another Vector To It
    return Vector2( _x + v2._x, _y + v2._y );
}
inline Vector2 &Vector2::operator+=( const Vector2 &v2 ) {
    _x += v2._x;
    _y += v2._y;
    return *this;
}
inline Vector2 Vector2::operator-() const {
    return Vector2( -_x, -_y );  // Unary - Operator: Negate Each Value
}
inline Vector2 Vector2::operator-( const Vector2 &v2 ) const {
    // Unary - Take This Vector And Subtract Another Vector From It
    return Vector2( _x - v2._x, _y - v2._x );
}
inline Vector2 &Vector2::operator-=( const Vector2 &v2 ) {
    _x -= v2._x;
    _y -= v2._y;
    return *this;
}
inline Vector2 Vector2::operator*( const float &value ) const {
    // Post Multiply Vector By A Scalar
    return Vector2( _x*value, _y*value );
} 
inline Vector2& Vector2::operator*=( const float &value ) {
    // Multiply This Vector By A Scalar
    _x *= value;
    _x *= value;    
    return *this; 
}
inline Vector2 Vector2::operator/( const float &value ) const {
    // Post Divide Vector By A Scalar    
    Vector2 vec2;
    // Again Math:: not shown here...
    if ( Math::isZero( value ) ) {
        vec2._x = 0.0f;
        vec2._y = 0.0f;
    } else {
        float inv = 1/value;
        vec2._x *= inv;
        vec2._y *= inv;
    }    
    return vec2;  
}
inline Vector2& Vector2::operator/=( const float &value ) {
    // Divide This Vector By A Scalar Value
    // Same as above; Math:: not shown here.
    if ( Math::isZero( value ) ) {
        _x = 0.0f;
        _y = 0.0f;
    } else {
        float inv = 1/value;
        _x *= inv;
        _y *= inv;
    }    
    return *this; 
}

这是我的一个较旧的类,这不是完整的类,因为它具有其他不是运算符的成员函数,例如normalizedotlength等。我刚刚展示了该类及其构造函数和运算符,以演示如何使用矩阵类执行类似操作。


作为

参考说明,如果您想了解如何实现通用矩阵类,有两个主要的库值得查看并通读其文档和源文件:GLM 是一个仅标头库,非常易于设置和使用。 另一方面,Eigen设置起来要多一些,并且确实有一点学习曲线需要习惯。

  • 格利姆
  • 特征