鱼C论坛

 找回密码
 立即注册
查看: 1131|回复: 2

[已解决]C++的问题

[复制链接]
发表于 2023-12-12 11:15:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class numbered
{
private:
        unsigned mysn = 1;
public:
        numbered();
        numbered(const numbered& s):mysn(s.mysn){}
        numbered& operator=(const numbered& s);
        ~numbered();
        void f(numbered s){cout << s.mysn <<endl;}

};

numbered::numbered()
{
        mysn++;
}
numbered& numbered::operator=(const numbered& s){
        mysn = s.mysn;
        return *this;
}
numbered::~numbered()
{
        cout << "已经删除"<<endl;
}
int main()
{  
        numbered a , b = a , c = b;
        f(a);
        return 0;
}
这里的f(a)是报错的,指出其这里为什么出错,并且给出改进的理由(希望人工回复,GPT效果每次都不太好)
最佳答案
2023-12-12 17:07:28
人工来啦~

有几个问题:

作用域问题:函数 f 被定义为 numbered 类的成员函数。当鱼油在 main() 函数中调用 f(a) 时,编译器会认为 f 是一个全局函数或当前作用域内的函数,而不是 numbered 类的成员。这就是为什么会报错的原因。
改进:鱼油可以将 f 改为全局函数或使用对象调用它。例如,使用 a.f(a);。

拷贝构造函数的设计:鱼油的拷贝构造函数只是简单地拷贝了原对象的 mysn 值。这在实际中可能不是鱼油想要的行为,尤其是当鱼油的类表示应该具有唯一标识的实体时。
改进:如果鱼油希望每个 numbered 对象都有一个唯一的 mysn 值,鱼油应该在拷贝构造函数中适当地修改这个值,而不是直接拷贝。

默认构造函数的设计:在鱼油的默认构造函数中,鱼油通过 mysn++ 来增加 mysn 的值。但是,由于每个对象的 mysn 都从 1 开始,所有对象的 mysn 都将是 2,这可能不是鱼油预期的行为。
改进:可以使用一个静态变量来跟踪下一个可用的 mysn 值。

代码优化:
#include <iostream>
using namespace std;

class numbered
{
private:
    static unsigned nextsn;
    unsigned mysn;
public:
    numbered() : mysn(nextsn++) {}
    numbered(const numbered& s) : mysn(nextsn++) {}
    ~numbered() { cout << "已经删除" << endl; }

    friend void f(numbered s);
};

unsigned numbered::nextsn = 1;

void f(numbered s) {
    cout << s.mysn << endl;
}

int main() {
    numbered a, b = a, c = b;
    f(a);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-12 11:16:44 | 显示全部楼层
你的代码中出现了一个问题。在成员函数`f`中,你希望打印出传入的对象`s`的`mysn`值,但你并没有定义这个成员函数。你需要在类的定义中添加这个函数并实现它。

另外,在拷贝构造函数和赋值运算符重载中,你将传入对象的`mysn`值直接赋给了当前对象的`mysn`值。这样做的话,所有对象的`mysn`值都将相同。如果你想要每个对象都有自己独特的`mysn`值,需要对其进行一些修改。

下面是修正后的代码:
#include <iostream>using namespace std;class numbered{private:    static unsigned count;    unsigned mysn;public:    numbered() : mysn(count++) {}    numbered(const numbered& s) : mysn(count++) {}    numbered& operator=(const numbered& s)    {        mysn = count++;        return *this;    }    ~numbered() {}    void f(numbered s)    {        cout << "mysn: " << s.mysn << endl;    }};unsigned numbered::count = 1;int main(){    numbered obj1;    numbered obj2;    numbered obj3;    obj1.f(obj2);    return 0;}
运行这段代码,你会看到输出结果是:
mysn: 3
这表明在`f`函数中,正确地打印出了传入对象的`mysn`值。每个对象都有自己独特的`mysn`值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-12 17:07:28 | 显示全部楼层    本楼为最佳答案   
人工来啦~

有几个问题:

作用域问题:函数 f 被定义为 numbered 类的成员函数。当鱼油在 main() 函数中调用 f(a) 时,编译器会认为 f 是一个全局函数或当前作用域内的函数,而不是 numbered 类的成员。这就是为什么会报错的原因。
改进:鱼油可以将 f 改为全局函数或使用对象调用它。例如,使用 a.f(a);。

拷贝构造函数的设计:鱼油的拷贝构造函数只是简单地拷贝了原对象的 mysn 值。这在实际中可能不是鱼油想要的行为,尤其是当鱼油的类表示应该具有唯一标识的实体时。
改进:如果鱼油希望每个 numbered 对象都有一个唯一的 mysn 值,鱼油应该在拷贝构造函数中适当地修改这个值,而不是直接拷贝。

默认构造函数的设计:在鱼油的默认构造函数中,鱼油通过 mysn++ 来增加 mysn 的值。但是,由于每个对象的 mysn 都从 1 开始,所有对象的 mysn 都将是 2,这可能不是鱼油预期的行为。
改进:可以使用一个静态变量来跟踪下一个可用的 mysn 值。

代码优化:
#include <iostream>
using namespace std;

class numbered
{
private:
    static unsigned nextsn;
    unsigned mysn;
public:
    numbered() : mysn(nextsn++) {}
    numbered(const numbered& s) : mysn(nextsn++) {}
    ~numbered() { cout << "已经删除" << endl; }

    friend void f(numbered s);
};

unsigned numbered::nextsn = 1;

void f(numbered s) {
    cout << s.mysn << endl;
}

int main() {
    numbered a, b = a, c = b;
    f(a);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 05:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表