【问题标题】:Input operator overloading not working properly // segmentation fault after input from user输入运算符重载无法正常工作 // 用户输入后出现分段错误
【发布时间】:2021-05-05 16:18:59
【问题描述】:

我有这个类,我正在尝试重载输入运算符,但我无法让它工作。 Ex2 准确地输出它应该输出的内容,但 ex13 在输入 2 个值后给我分段错误。 我不允许从“private:”访问说明符中更改变量的类型

作为输入,我需要写这个(或类似的):

14 戴尔 150

这些输入用于(从罗马尼亚语翻译成英语):

序号 // 序号 生产者//制造商 nrPaginiPrintate // 打印页数 Imprimanta = 打印机

这里是代码:

#include <string>
using namespace std;
class Imprimanta
{
private:
    const int serialNumber;
    char* producator;
    int nrPaginiPrintate;
    static string tipImprimanta;
public:
    Imprimanta() :serialNumber(1)
    {
        this->producator = (char*)"";
        this->nrPaginiPrintate = 0;
    }

    Imprimanta(int serialNumber,  const char* producator, int nrPaginiPrintate) :serialNumber(serialNumber)
    {
        string* str = new string();
        *str = producator;
        this->producator = (char*)(str->c_str());
        this->nrPaginiPrintate = nrPaginiPrintate;
    }

    ~Imprimanta(){}

    Imprimanta(const Imprimanta& i) :serialNumber(i.serialNumber) {
        string* str = new string();
        *str = i.producator;
        this->producator = (char*)(str->c_str());
        this->nrPaginiPrintate = i.nrPaginiPrintate;
        this->tipImprimanta = i.tipImprimanta;
    }

    Imprimanta operator=(Imprimanta i)  {
        string* str = new string();
        *str = i.producator;
        this->producator = (char*)(str->c_str());
        this->nrPaginiPrintate = i.nrPaginiPrintate;
        this->tipImprimanta = i.tipImprimanta;
        int* ptr;
        ptr = (int*)(&serialNumber);
        *ptr = i.serialNumber;
        return *this;
    }

    bool operator<(Imprimanta t)
    {
        if (nrPaginiPrintate < t.nrPaginiPrintate) {
            return true;
        }
        else {
            return false;
        }
    }

    int get_nrPaginiPrintate() {
        return nrPaginiPrintate;
    }
    void set_nrPaginiPrintate(int pagini_print) {
        this->nrPaginiPrintate = pagini_print;
    }

    static string getTipImprimanta()
    {
        return tipImprimanta;
    }

    static void setTipImprimanta(string tipImprimanta_a)
    {
        tipImprimanta = tipImprimanta_a;
    }

    int get_serialNumber() {
        return serialNumber;
    }
    friend ostream& operator<<(ostream& out, const Imprimanta& e);
    friend istream& operator>>(istream& in, Imprimanta& e);
};
string Imprimanta::tipImprimanta = "Cerneala";

ostream& operator<<(ostream& out, const Imprimanta& e)
{
    out << "Serial Number: " << e.serialNumber << '\n';
    out << "Producator: " << e.producator << '\n';
    out << "Numar pagini printate: " << e.nrPaginiPrintate << '\n';
    return out;
}

istream& operator>>(istream& in, Imprimanta& e)
{
    int* ptr;
    ptr = (int*)(&e.serialNumber);
    in >> *ptr;
    in >> e.producator;
    in >> e.nrPaginiPrintate;
    return in;
}

int main()
{


    //2
    cout << "-----------------------EX_2-----------------------";
    cout << '\n';
    Imprimanta i2(2, "Canon", 160);
    cout << i2;
    cout << '\n';

    //13
    cout << "-----------------------EX_13-----------------------";
    cout << '\n';
    Imprimanta i11;
    cin >> i11;
    cout << i11;
    cout << '\n';

    return 0;
}```

【问题讨论】:

    标签: c++ class input segmentation-fault operator-overloading


    【解决方案1】:

    免责声明:问题中的代码读起来就像是为了演示在编译时代码可能会损坏的程度。如果将类定义提供给 OP 并请求添加 operator&lt;&lt;,则无法以任何有意义的方式解决该练习,只能丢弃代码并从头开始。无论如何,这只是解决operator&lt;&lt; 中的问题,而忽略了无数其他问题......

    您可能添加了这个以消除由于修改 const 引起的错误:

    int* ptr;
    ptr = (int*)(&e.serialNumber);
    in >> *ptr;
    

    但是,您所做的只是消除错误。问题仍然存在。实际上,这就是 c 风格转换大部分时间所做的:他们隐藏问题而不修复它。您不得修改 const 的对象。如果这样做,就会调用未定义的行为。

    如果您希望 serialNumber 不可修改,请将其设为 private 并且不提供任何修改器方法。实际上已经是这样了,所以您可以简单地删除const 并读取值“正常”:

    in >> e.serialNumber;
    

    【讨论】:

    • 实际上。我本来可以让serialNumber 成为一个简单的int(不是const),生产者是字符串而不是char*,但是给出这个的老师告诉我们,我们不能更改变量的类型或它们的访问权限。像这样的东西,只是解决练习。如果我修改它们,我的作业得 0 分
    • @SergiuLuce 您必须在问题中提及此类约束。请明确哪些可以更改,哪些不能更改。
    • 对不起。我忘了提这个。下次我会更小心的
    • @SerguiLuce 为什么下次?如果您无法应用此修复程序,则此答案不会回答您的问题,您应该澄清问题
    • @SergiuLuca 我不清楚“//我不允许更改任何变量类型或访问它”的确切含义(以及为什么大喊大叫?!?)。 ptr = (int*)(&amp;e.serialNumber); 正在访问一个变量,如果你不能改变它,那你就不走运了。请明确提供给您的代码的哪些部分,您不能更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多