【问题标题】:C++:copy constructorC++:复制构造函数
【发布时间】:2013-12-19 15:04:58
【问题描述】:

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

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

头文件.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;
}

【问题讨论】:

  • 警告标志:您的班级中有一个double *,但在您的复制构造函数中,没有任何东西在double * 后面分配新的存储空间。你为什么不在这里使用vector&lt;double&gt;
  • 警告标志2:您将new[] 用于coefficients,但与delete[] 不匹配

标签: c++ copy-constructor


【解决方案1】:
class Polynomial {
private: 
    int degree; 
    double* coefficients; // Pointer to double

    /* ... */
}

您已将 coefficients 声明为 指向双精度的指针,而不是数组。

for(int i = 0; i <= wzor.degree; i++) {
    coefficients[i] = wzor.coefficients[i]; // Error! No memory allocated.
}

在这里,您尝试将值分配给不存在的内存。您需要先分配数组,然后才能将元素数据分配给它。此外,您应该在 initialization list 而不是 ctor 主体中初始化成员。试试这样的:

Polynomial::Polynomial(const Polynomial& wzor)
    : degree(wzor.degree), coefficients(new double[wzor.degree + 1]) { // Init
    for (int i=0;i<=wzor.degree;i++) {
        coefficients[i]=wzor.coefficients[i];
    }
}

请记住,复制构造函数是一个构造函数。它将构造对象的新实例,您需要为新副本分配新内存。

在你的析构函数中你必须使用delete[] 而不是delete,因为你正在删除一个数组。

赋值运算符应声明为:

Polynomial& operator= (const Polynomial& obiekt);

对于存储数组索引的变量,您应该使用类型 std::size_t 而不是 int

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

【讨论】:

  • 你说得对,这是个问题。还有一个问题。为什么赋值运算符应该声明为:Polynomial& operator= (const Polynomial& obiekt);我想分配一些东西,所以我想更改我正在使用的对象,我不想获得作为参数应用的对象副本的新对象。
  • @user3061714 Polynomial&amp; operator= (const Polynomial&amp; obiekt) 的定义应该返回一个 reference 到分配给的对象(例如{degree=obiekt.degree;return *this;}),而不是参数的副本(它被声明为返回参考)。这是声明复制赋值运算符的常用方法,因为它允许像if ((x = y)) {}x = y = z(运算符链接)这样的表达式。有关更多信息,请参阅:stackoverflow.com/questions/9072169/…
【解决方案2】:
#include <vector>

std::vector<double> coefficients; 

您可以使用向量的副本,这意味着您不必自己实现它。 而且您不必执行删除操作。

使用 resize & [] 或 push_back 方法处理字符串。你的学位将是 coefficients.size()。

【讨论】:

    【解决方案3】:

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

    Polynomial & operator=(const Polynomial &obiekt);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2015-02-07
      • 1970-01-01
      • 2018-10-17
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多