如何制作副本构造函数?

时间:2018-12-06 09:26:46

标签: c++ class oop

我想为此类RNA创建一个复制构造函数,以从另一个对象RNA复制详细信息

#include "RNA.h"
#include"Sequence.h"
#include<bits/stdc++.h>
using namespace std;
RNA::RNA()
{
    set_sequence();
}

RNA::RNA(char * seq, RNA_Type atype)
{
    int x;
    int i=0;

    while(1)
    {
        if(seq[i] != 'C'&&seq[i] != 'G'&&seq[i] != 'A'&&seq[i] != 'U')break;
        x++;
        i++;
    }
    x--;
    length = x;
    this->seq = new char[length];
    for(int i=0;i<length;i++)
    {
        this->seq[i] = seq[i];
    }
    type = atype;
}

这是副本构造函数

RNA::RNA( RNA& rhs)
{
    seq = new char[length];
    for(int i=0;i<length;i++)
    {
        seq[i] = rhs.seq[i];
    }
    type  = rhs.type;
}

主要是我尝试这样做并导致错误

    int l;
     cin>>l;
     char* arr = new char[l];
     for(int i=0;i<l;i++)
     {
         cin>>arr[i];
     }
     cin>>l;
      RNA anas(arr,(RNA_Type)l);
  int s;
     cin>>s;
     char* arr2 = new char[s];
     for(int i=0;i<s;i++)
     {
         cin>>arr2[i];
     }
     cin>>s;
     RNA saeed(arr2,(RNA_Type)s);
     saeed(anas);  error is here 
      saeed.Print();

错误为“无法匹配'(RNA)(RNA&)'的调用 所以我该怎么做才能解决此错误

3 个答案:

答案 0 :(得分:1)

最简单的方法是让编译器为您完成。

class RNA
{
    RNA_Type type;
    std::string seq;
public:
    RNA(std::string = /* default seq */, RNA_Type = /* default type */);

    /* implicitly generated correctly
    ~RNA();
    RNA(const RNA &);
    RNA & operator = (const RNA &);
    RNA(RNA &&);
    RNA & operator = (RNA &&);
    */

    // other members
};

RNA::RNA(std::string aseq, RNA_Type atype)
 : seq(aseq.begin(), aseq.find_first_not_of("ACGT")), type(atype)
{}

答案 1 :(得分:0)

saeed当时已经存在,您正在尝试像使用它一样使用它。
除了正在构造时,您无法复制构造,并且看起来像其他初始化:

RNA saeed(anas);

或:

RNA saeed{anas};

如果要替换已经存在的对象的值,请使用赋值(并且需要实现该赋值;请参阅The Rule Of Three。)

答案 2 :(得分:0)

saeed(anas); 

不是对构造函数RNA::RNA(RNA const&)的调用,而是对RNA::operator()(RNA const&)的调用,该调用不存在。

您大概想要的是副本分配运算符

RNA& RNA::operator=(RNA const&);

对于足够简单的类,将由编译器自动生成(如Caleth的回答所述)。要调用它,请用

替换您的行
saeed = anas;