鱼C论坛

 找回密码
 立即注册
查看: 1539|回复: 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 值。

代码优化:

  1. #include <iostream>
  2. using namespace std;

  3. class numbered
  4. {
  5. private:
  6.     static unsigned nextsn;
  7.     unsigned mysn;
  8. public:
  9.     numbered() : mysn(nextsn++) {}
  10.     numbered(const numbered& s) : mysn(nextsn++) {}
  11.     ~numbered() { cout << "已经删除" << endl; }

  12.     friend void f(numbered s);
  13. };

  14. unsigned numbered::nextsn = 1;

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

  18. int main() {
  19.     numbered a, b = a, c = b;
  20.     f(a);
  21.     return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

下面是修正后的代码:
  1. #include <iostream>
  2. using namespace std;
  3. class numbered
  4. {
  5. private:
  6.     static unsigned count;
  7.     unsigned mysn;
  8. public:
  9.     numbered() : mysn(count++) {}
  10.     numbered(const numbered& s) : mysn(count++) {}
  11.     numbered& operator=(const numbered& s)
  12.     {
  13.         mysn = count++;
  14.         return *this;
  15.     }
  16.     ~numbered() {}
  17.     void f(numbered s)
  18.     {
  19.         cout << "mysn: " << s.mysn << endl;
  20.     }
  21. };
  22. unsigned numbered::count = 1;
  23. int main()
  24. {
  25.     numbered obj1;
  26.     numbered obj2;
  27.     numbered obj3;
  28.     obj1.f(obj2);
  29.     return 0;
  30. }
复制代码

运行这段代码,你会看到输出结果是:
  1. mysn: 3
复制代码

这表明在`f`函数中,正确地打印出了传入对象的`mysn`值。每个对象都有自己独特的`mysn`值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://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 值。

代码优化:

  1. #include <iostream>
  2. using namespace std;

  3. class numbered
  4. {
  5. private:
  6.     static unsigned nextsn;
  7.     unsigned mysn;
  8. public:
  9.     numbered() : mysn(nextsn++) {}
  10.     numbered(const numbered& s) : mysn(nextsn++) {}
  11.     ~numbered() { cout << "已经删除" << endl; }

  12.     friend void f(numbered s);
  13. };

  14. unsigned numbered::nextsn = 1;

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

  18. int main() {
  19.     numbered a, b = a, c = b;
  20.     f(a);
  21.     return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-19 22:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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