C++ 使用字符串初始化我的类的对象
我正在写一个多项式类:C++ 使用字符串初始化我的类的对象,c++,initialization,operator-overloading,C++,Initialization,Operator Overloading,我正在写一个多项式类: #pragma once #include<iostream> using namespace std; class polynomial { private: int coeff[300]; int expo[300]; int counter; public: polynomial(); polynomial(const polynomial&); polynomial operator-()co
#pragma once
#include<iostream>
using namespace std;
class polynomial
{
private:
int coeff[300];
int expo[300];
int counter;
public:
polynomial();
polynomial(const polynomial&);
polynomial operator-()const;
polynomial& operator=(const polynomial);
polynomial operator*(const polynomial)const;
polynomial operator+(const polynomial)const;
polynomial operator-(const polynomial)const;
polynomial operator+(int)const;
friend polynomial operator+(int,const polynomial);
polynomial operator-(int)const;
friend polynomial operator-(int,const polynomial);
polynomial operator*(int)const;
polynomial operator/(polynomial);
friend polynomial operator*(int,const polynomial);
friend ostream& operator<<(ostream&, polynomial&);
friend istream& operator>>(istream&, polynomial&);
};
#pragma一次
#包括
使用名称空间std;
类多项式
{
私人:
整数系数[300];
国际博览会[300];
整数计数器;
公众:
多项式();
多项式(常数多项式&);
多项式算子-()常数;
多项式&算子=(常数多项式);
多项式算子*(常数多项式)常数;
多项式算子+(常数多项式)常数;
多项式算子-(常数多项式)常数;
多项式算子+(int)常数;
友元多项式算子+(int,const多项式);
多项式算子-(int)常数;
友元多项式算子-(int,const多项式);
多项式算子*(int)常数;
多项式算子/(多项式);
友元多项式算子*(int,const多项式);
friend-ostream算子(istream&,多项式&);
};
我以字符串形式接收多项式,如下所示:
+3x^2-10x+1
使用cin
对象,然后在istream&operator>(istream&,Polyman&)
中,我将提取它的系数和指数
除了我重载的构造函数和复制构造函数以及运算符之外,我应该能够初始化多项式类的对象,如:
多项式p1=“+5x^2-3”//(主要)
我已经尝试过两次重载我的复制赋值运算符(除此之外,它已经在代码中,另一个用于字符串),如下所示:
多项式运算符=(字符串)
我失败了
我真的不知道,如何用字符串初始化多项式类的对象。有什么方法可以做到这一点呢?您需要的是一个采用std::string
类型的单个参数的
构造函数定义看起来像:
polynomial(std::string const &s) {
// use s to construct
}
但是,您仍然无法按照所需的方式构造多项式
对象:
polynomial p1 = "+5x^2-3";
因为编译器需要进行2次隐式转换才能调用相应的构造函数。请注意,您仍然可以执行以下操作:
polynomial p1 {"+5x^2-3"};
// or
polynomial p1 = std::string{"+5x^2-3"};
要解决此问题,可以添加一个构造函数,该构造函数接受char常量*
,并委托给std::string
构造函数:
polynomial(char const * c) : polynomial(std::string{c}) {}
现在您的代码片段应该可以工作了。我没有看到接受字符串的构造函数。第二件事——给定数据成员,不需要用户定义的复制构造函数或赋值运算符。提供这些函数所做的一切都可能会引入bug。大家好,有趣的是,也许可以添加一个构造函数
多项式(const string&s)
@PaulMcKenzie您是对的,但我必须在我的代码中添加它们,在构造函数中,我只需将系数设置为零,并使用cin
获取字符串。如果你说的是复制赋值函数,那么不,你根本不需要在代码中添加它们。复制赋值函数是用来复制的,编译器会自动完成,不会出错。如果你的成员变量是指针或持有的资源,那么就会创建一个用户定义的复制赋值函数。老师真的不应该让你写不需要的东西。在不需要时提供您自己的复制构造函数和赋值操作会导致出现bug,如果没有bug,则会阻止编译器生成高效代码,因为编译器知道如何以最佳方式生成浅拷贝。当您提供这些函数(也适用于空析构函数)时,它还可能更改类类型的特征。polymonal(std::string const&s){…}
<代码>多项式p1=“+5x^2-3”代码>因为您要求编译器进行两次隐式转换。相反,您可以执行多项式p1(“+5x^2-3”)
或使用签名定义一个构造函数多项式(const char*)
@PaulSanders true,修复了答案。@cigien编译器必须进行的两个隐式转换是什么?@PaulSanders抱歉,编译器必须进行的两个隐式转换是什么?@hanie从const char*
到const std::string&
,然后从const std::string&
到多项式
。