Как сделать копию конструктора? - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу сделать конструктор копирования для этого класса 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 голосов
/ 06 декабря 2018

Самый простой способ - позволить компилятору сделать это за вас.

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)
{}
0 голосов
/ 06 декабря 2018

Строка

saeed(anas); 

- это не вызов конструктора RNA::RNA(RNA const&), а RNA::operator()(RNA const&), которого не существует.

То, что вы, вероятно, хотите, это скопировать оператор присваивания

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

, который для достаточно простых классов будет автоматически сгенерирован компилятором (как объяснено в ответе Калет).Чтобы позвонить, замените свою линию на

saeed = anas; 
0 голосов
/ 06 декабря 2018

saeed уже существует в этой точке, и вы пытаетесь использовать его, как если бы это была функция.
Вы не можете копировать-конструировать, кроме случаев, когда вы создаете, и это выглядит как любая другая инициализация:

RNA saeed(anas);

или:

RNA saeed{anas};

Если вы хотите заменить значение уже существующего объекта, вы используете назначение (и вам нужно реализовать это назначение; читайте о Правило трех .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...