【问题标题】:C++ Class implementation [closed]C ++类实现[关闭]
【发布时间】:2018-03-03 21:03:27
【问题描述】:

编辑原始问题,因为它被标记得太宽泛。 如果我有一个读取数组值的 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;
       }
    }
};

【问题讨论】:

  • 你需要阅读一本好的 C++ 教科书。
  • @NeilButterworth 我已经编辑了问题,现在可以取消了吗?
  • 您可以参考下面有关重载运算符的答案。提示,因为您是 C++ 新手并且来自 C,所以我会尽量避免在原始指针和 malloc & free 上使用 new;标准库有shared_ptr&lt;T&gt;unique_ptr&lt;T&gt; 只是为了帮助减少内存泄漏、无效指针、悬空指针和引用。要使用它们包括&lt;memory&gt;,但是如果您查看下面的 Vector2 类,我使用的是原始指针,但我没有在堆上分配它们的内存。指针被传递到构造函数之一,我只是使用数组索引。

标签: c++ class


【解决方案1】:

虽然这不是一个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 需要更多地参与设置,并且确实有一点学习曲线需要习惯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2012-11-17
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多