C++;:复制构造函数 我的程序在C++中有问题。我尝试编写复制构造函数。在我开始从应用为引用的对象复制数组中的元素之前,一切都很好。 我可以打印应用数组的每个元素,但不能将其复制到复制构造函数将创建的对象中的数组中

C++;:复制构造函数 我的程序在C++中有问题。我尝试编写复制构造函数。在我开始从应用为引用的对象复制数组中的元素之前,一切都很好。 我可以打印应用数组的每个元素,但不能将其复制到复制构造函数将创建的对象中的数组中,c++,copy-constructor,C++,Copy Constructor,下面是代码(我只显示头文件和一些需要复制构造函数的方法,因为我认为所有代码都太长了) 标题.h #pragma once # include <iostream> # include <fstream> # include <cmath> using namespace std; class Polynomial { private: int degree; double* coefficients; public:

下面是代码(我只显示头文件和一些需要复制构造函数的方法,因为我认为所有代码都太长了)

标题.h

#pragma once
# include <iostream> 
# include <fstream> 
# include <cmath>
using namespace std;

class Polynomial {
private: 
    int degree; 
    double* coefficients; 


public: 
    static const string errors[5];
    Polynomial(const Polynomial& wzor); // konstruktor kopiujacy
    Polynomial(float n);
    ~Polynomial();
    void setCoefficient(unsigned int i, double value); 
    double getCoefficient(unsigned int i); 
    double value(double x); 
    friend ostream & operator <<(ostream & out, Polynomial & p);
    double operator[](const int index);
    double operator()(double x);
    void operator=(Polynomial &obiekt);
    friend Polynomial operator+(Polynomial &obiekt,Polynomial &obiekt1);
    friend Polynomial operator-(Polynomial &obiekt,Polynomial &obiekt1);
    friend Polynomial operator~(Polynomial &obiekt);
    friend Polynomial operator*(Polynomial &obiekt,Polynomial &obiekt1);
    friend Polynomial operator*(Polynomial &obiekt,double x);
};

Polynomial::Polynomial(float n) {

    if(n<0){
        throw 0;
    }
    else if(floor(n)-n != 0){
        throw 2;
    }

    degree=(int)n;
    coefficients=new double [(int)n+1]; 
    for(unsigned int i=0; i<n; i++) { 
        coefficients[i]=0.0; 
    } 
    coefficients[(int)n]=1.0; 
}

Polynomial::Polynomial(const Polynomial &wzor){
    degree=wzor.degree; // it's allright 
    for(int i=0; i<=wzor.degree; i++){
        coefficients[i]=wzor.coefficients[i]; // compilator says that this line is wrong 
    }
}

Polynomial::~Polynomial(){

    delete coefficients;

}

Polynomial operator+(Polynomial &obiekt,Polynomial &obiekt1){
    Polynomial nowy(1);
    if(obiekt1.degree > obiekt.degree){
        nowy=obiekt1;
        for(int i=0; i<=obiekt.degree; i++){
            nowy.coefficients[i]=nowy.coefficients[i]+obiekt.coefficients[i];
        }
    }
    else{
        nowy=obiekt;
        for(int i=0; i<=obiekt1.degree; i++){
            nowy.coefficients[i]=nowy.coefficients[i]+obiekt1.coefficients[i];
        }
    }
    return nowy;
}
#pragma一次
#包括
#包括
#包括
使用名称空间std;
类多项式{
私人:
智力度;
双*系数;
公众:
静态常量字符串错误[5];
多项式(const多项式&wzor);//konstruktor kopiujacy
多项式(浮点n);
~多项式();
无效设置系数(无符号整数i,双精度值);
双系数(无符号整数i);
双值(双x);
friend ostream&运营商
您已将
系数声明为指向double的指针,而不是数组

for(int i = 0; i <= wzor.degree; i++) {
    coefficients[i] = wzor.coefficients[i]; // Error! No memory allocated.
}
对于存储数组索引的变量,应该使用type
std::size\t
,而不是
int

最后,我建议使用标准库中的容器,而不是内置数组,例如
std::vector

您已将
系数声明为指向double指针,而不是数组

for(int i = 0; i <= wzor.degree; i++) {
    coefficients[i] = wzor.coefficients[i]; // Error! No memory allocated.
}
对于存储数组索引的变量,应该使用type
std::size\t
,而不是
int


最后,我建议使用标准库中的容器而不是内置数组,例如
std::vector

您的赋值运算符是错误的。它应该是

Polynomial & operator=(const Polynomial &obiekt);

你的赋值运算符错了,应该是

Polynomial & operator=(const Polynomial &obiekt);
#包括
std::向量系数;
您可以使用向量的副本,这意味着您不必自己实现它。 你不必做删除的事情

使用resize&[]或push_back方法处理字符串。您的度数将是coverties.size()。

\include
std::向量系数;
您可以使用向量的副本,这意味着您不必自己实现它。 你不必做删除的事情


使用resize&[]或push_back方法处理字符串。您的度数将是coverties.size().

警告标志:您的类中有一个
double*
,但在副本构造函数中没有任何东西在该
double*
后面分配新的存储。您为什么不在这里使用
vector
呢?警告标志2:您对
系数
使用
new[]
,但没有将其与
delete[]匹配
警告标志:您的类中有一个
double*
,但是在副本构造函数中没有任何东西在该
double*
后面分配新的存储。您为什么不在这里使用
vector
呢?警告标志2:您对
系数
使用
new[]
,但没有将其与
delete[]匹配
你是对的,这是一个问题。还有一个问题。为什么赋值运算符应该声明为:多项式&运算符=(const多项式&obiekt);我想赋值,所以我想更改正在使用的对象,我不想得到作为参数应用的对象副本的新对象。@user3061714
polyman&operator=(const polyman&obiekt)
的定义应该返回对分配给的对象的引用(例如
{degree=obiekt.degree;return*this;}
),而不是参数的副本(声明为返回引用)。这是声明复制赋值运算符的常用方法,因为它允许表达式,如
if((x=y)){}
x=y=z
(运算符链接)。有关更多信息,请参见此:您是对的,这是一个问题。还有一个问题。为什么赋值运算符应声明为:多项式&运算符=(const多项式&obiekt);我想赋值,所以我想更改正在使用的对象,我不想得到作为参数应用的对象副本的新对象。@user3061714
polyman&operator=(const polyman&obiekt)
的定义应该返回对分配给的对象的引用(例如
{degree=obiekt.degree;return*this;}
),而不是参数的副本(声明为返回引用)。这是声明复制赋值运算符的常用方法,因为它允许使用诸如
if((x=y)){}
x=y=z
(运算符链接)之类的表达式。有关更多信息,请参见此:
Polynomial & operator=(const Polynomial &obiekt);
#include <vector>

std::vector<double> coefficients;