注册 登录
编程论坛 C++教室

以下代码是否符合题意

hffjhhh 发布于 2021-02-04 15:56, 3025 次点击
下面是一个类声明,
程序代码:
class Move{
    private:
        double x;
        double y;
    public:
        Move(double a=0,double b=0);//set x,y to a,b
        showmove() const;           //shows current x,y values
        Move add(const Move &m)const;
        //this function adds x of m to x of invoking object to get new x,
        
//adds y of m to y of invoking object to get new y,creates a new move object initialized to new x,y values and returns it.
        reset(double a=0,double b=0);   //resets x,y to a,b
};

请提供成员函数的定义和测试这个类的程序。

以上就是题目。
代码如下:
程序代码:
#include<iostream>
using namespace std;
class Move{
    private:
        double x;
        double y;
    public:
        Move(double a=0,double b=0);
        showmove() const;        
        Move add(const Move &m)const;

        reset(double a=0,double b=0);   
};
Move::Move(double a,double b){
    x=a;
    y=b;
}
Move::showmove()const{
    cout<<"x值:"<<x<<endl;
    cout<<"y值:"<<y<<endl;
}
Move Move::add(const Move &m)const{
    Move invoking;
    invoking.x=m.x;
    invoking.y=m.y;
    Move aaa(x,y);
    return (x,y);
}
Move::reset(double a,double b){
    x=a;
    y=b;
}
int main(){   
    Move bbb;
    bbb.showmove();
    double x,y;
    cout<<"输入x值:";
    cin>>x;
    cout<<"输入y值:";
    cin>>y;
    Move ccc(x,y);
    ccc.add(ccc);
    ccc.reset(x,y);
    ccc.showmove();
    return 0;
}
11 回复
#2
rjsp2021-02-04 16:52
    Move aaa(x,y);
    return (x,y);
这是什么?
#3
hffjhhh2021-02-04 19:31
以下是引用rjsp在2021-2-4 16:52:49的发言:

这是什么?

这是个错误的写法,原本要返回aaa这个对象。是不是要改为这样:
    Move aaa(x,y);
    return aaa;
#4
rjsp2021-02-04 20:38
回复 3楼 hffjhhh
我觉得应该是将
Move Move::add(const Move &m)const{
    Move invoking;
    invoking.x=m.x;
    invoking.y=m.y;
    Move aaa(x,y);
    return (x,y);
}
改为
Move Move::add(const Move& m) const
{
    return Move(x+m.x, y+m.y);
}
#5
hffjhhh2021-02-04 21:14
以下是引用rjsp在2021-2-4 20:38:21的发言:

改为
Move Move::add(const Move& m) const
{
    return Move(x+m.x, y+m.y);
}

下面这行
return Move(x+m.x, y+m.y);

当中的Move是个带2个参数进行初始化的对象吗?这个对象来自于哪里?


另外如果改为这样,那是不是就少了题目中要求的invoking对象?
#6
rjsp2021-02-05 08:55
当中的Move是个带2个参数进行初始化的对象吗?
是,很显然

这个对象来自于哪里?
听不懂

另外如果改为这样,那是不是就少了题目中要求的invoking对象?
我英文够差了,你比我还差。
“invoking object”是“调用对象”,比如你代码中的“ccc.add(……)”中“ccc”就是“invoking object”。
因此,“adds x of m to x of invoking object to get new x”翻译成汉语是“将 m.x 与 this->x 相加得到新的 x”
#7
rjsp2021-02-05 09:24
假如撇开原题,按照正常的逻辑来写,那应该是
程序代码:
#include <iostream>

class Coordinate
{
public:
    Coordinate() noexcept = default;
    Coordinate( double x, double y ) noexcept;
    Coordinate( const Coordinate& rhs ) noexcept = default;
    Coordinate& operator=( const Coordinate& rhs ) noexcept = default;
    Coordinate operator+( const Coordinate& rhs ) const noexcept;
    void reset( double x, double y ) noexcept;
    friend std::ostream& operator<<( std::ostream&, const Coordinate& );

private:
    double x_=0, y_=0;
};

Coordinate::Coordinate( double x, double y ) noexcept : x_(x), y_(y)
{
}

Coordinate Coordinate::operator+( const Coordinate& rhs ) const noexcept
{
    return Coordinate(x_+rhs.x_, y_+rhs.y_);
}

void Coordinate::reset( double x, double y ) noexcept
{
    x_ = x;
    y_ = y;
}

std::ostream& operator<<( std::ostream& os, const Coordinate& rhs )
{
    return os << rhs.x_ << ' ' << rhs.y_;
}

using namespace std;

int main( void )
{
    // 测试缺省构造函数,应当输出“0 0”
    cout << Coordinate() << endl;

    // 测试构造函数,应当输出“1 2”
    cout << Coordinate(1,2) << endl;

    // 测试原题中的 Move::add,应当输出“4 6”
    cout << Coordinate(1,2)+Coordinate(3,4) << endl;

    // 测试 reset,应当输出“7 8”和“9 10”
    Coordinate a(7,8);
    cout << a << endl;
    a.reset(9,10);
    cout << a << endl;
}


[此贴子已经被作者于2021-2-5 09:28编辑过]

#8
裂开的闭眼猪2021-02-05 10:42
Move Move::add(const Move &m)const{
    Move invoking;
    invoking.x=m.x;
    invoking.y=m.y;
    Move aaa(x,y);
    return (x,y);
}

我认为成员函数add()应该是这样:
Move Move::add(const Move &m) const{
    Move temp(x+m.x,y+m.y);
    return temp;
}



[此贴子已经被作者于2021-2-5 13:57编辑过]

#9
hffjhhh2021-02-06 19:02
以下是引用rjsp在2021-2-4 20:38:21的发言:

改为
Move Move::add(const Move& m) const
{
    return Move(x+m.x, y+m.y);
}

以下这行
return Move(x+m.x, y+m.y);
当中的Move对象是来自以下这行this指针函数所创建的对象是吗?
Move Move::add(const Move& m) const
即由红色字体部分所创建的对象,是这样吗?

另外8楼的写法是否也符合题意?

[此贴子已经被作者于2021-2-6 19:15编辑过]

#10
rjsp2021-02-07 08:23
回复 9楼 hffjhhh
听不懂
#11
hffjhhh2021-02-07 09:45
回复 10楼 rjsp
即返回语句中的Move对象是在哪里创建的?哪一行语句创建了Move这个对象?
#12
rjsp2021-02-07 16:47
回复 11楼 hffjhhh
Move Move::add(const Move& m) const
{
    return Move(x+m.x, y+m.y);
}
就相当于
Move Move::add(const Move& m) const
{
    Move temp(x+m.x, y+m.y);
    return temp;
}
1