如何在C ++中使用类对象访问指针数据成员?

时间:2018-08-03 05:48:04

标签: c++ pointers

我有以下code

class FLOAT    
{
    float *num;

public:
    FLOAT(){}
    FLOAT(float f)
    {
        num = new float(f);
    }

    FLOAT operator +(FLOAT& obj)
    {
        FLOAT temp;
        temp.num = new float;

        temp.num = *num + obj.getF();
        return temp;    
    }

    float getF(){ return *num; }
    void showF(){ cout << "num : "<< *num << endl; }
};

显示错误。

我的问题是,如何使用类对象访问该float *num数据成员?

2 个答案:

答案 0 :(得分:3)

您的课堂上有很多错误。根本设置不正确。

  • 该类的默认构造函数根本不分配float

  • 该课程未遵循Rule of 3/5/0。它缺少释放浮点数的析构函数,复制构造函数和复制赋值运算符以制作浮点数的安全副本,并且在C ++ 11和更高版本中,它缺少移动构造函数和move赋值运算符来安全地在浮点数之间移动浮点数。对象。

  • 您的operator+在为浮点数分配新值时未取消引用指针。

尝试以下方法:

class FLOAT
{
    float *num;

public:
    FLOAT(float f = 0) : num(new float(f)) {}

    FLOAT(const FLOAT &src) : num(new float(*(src.num))) {}

    // in C++11 and later...
    FLOAT(FLOAT &&src) : num(src.num) { src.num = nullptr; }
    // alternatively:
    // FLOAT(FLOAT &&src) : num(nullptr) { std::swap(num, src.num); }

    ~FLOAT() { delete num; }

    FLOAT& operator=(const FLOAT &rhs)
    {
        *num = *(rhs.num);
        return *this;
    }

    // in C++11 and later...
    FLOAT& operator=(FLOAT &&rhs)
    {
        std::swap(num, rhs.num);
        return *this;
    }

    FLOAT operator+(const FLOAT& rhs)
    {
        FLOAT temp;
        *(temp.num) = *num + rhs.getF();
        return temp;

        // or simply:
        // return *num + rhs.getF();
    }

    float getF() const { return *num; }
    void showF() { cout << "num : " << *num << endl;    }
};

话虽如此,根本没有充分的理由动态地分配浮点数(可能作为学习经验除外)。让编译器为您处理内存管理:

class FLOAT
{
    float num;

public:
    FLOAT(float f = 0) : num(f) {}

    FLOAT(const FLOAT &src) : num(src.num) {}

    FLOAT& operator=(const FLOAT &rhs)
    {
        num = rhs.num;
        return *this;
    }

    FLOAT operator+(const FLOAT& rhs)
    {
        FLOAT temp;
        temp.num = num + rhs.getF();
        return temp;

        // or simply:
        // return num + rhs.getF();
    }

    float getF() const { return num; }
    void showF() { cout << "num : " << num << endl; }
};

然后可以通过允许编译器为您隐式定义复制构造函数和复制赋值运算符来简化以下内容:

class FLOAT
{
    float num;

public:
    FLOAT(float f = 0) : num(f) {}

    FLOAT operator+(const FLOAT& rhs)
    {
        FLOAT temp;
        temp.num = num + rhs.getF();
        return temp;

        // or simply:
        // return num + rhs.getF();
    }

    float getF() const { return num; }
    void showF() { cout << "num : " << num << endl; }
};

答案 1 :(得分:1)

分配波纹管语句时:

temp.num = *num + obj.getF();

实际上,您将浮点数number分配给了浮点数pointer

因此,使用波纹管:

(*temp.num) = (*num) + obj.getF();

代替:

temp.num = *num + obj.getF();