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&
多项式