i你哟 发表于 2023-12-12 11:15:57

C++的问题

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效果每次都不太好)

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 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;
}
页: [1]
查看完整版本: C++的问题