2012-04-21 3 views
0

Мне нужна помощь в выполнении этого экземпляра копии в моей объектно-ориентированной программе. Результат должен состоять в том, чтобы скопировать строку 1: Hello World в строку 2: This is a test.Лучший способ выполнения копирования с использованием .Copy?

В моей .h файле:

void Copy(MyString& one); 

В моем .cpp файле:

void MyString::Copy(MyString& one) 
{ 
    one = String; 
} 

В моем main.cpp файле:

String1.Print(); 
cout << endl; 
String2.Print(); 
cout << endl;  
String2.Copy(String1);  
String1.Print();  
cout << endl; 
String2.Print(); 
cout << endl; 

Выход:

Hello World 
This is a test 
is a test 
This is a test 

Это должно быть:

Hello World 
This is a test 
Hello World 
Hello World 

Пожалуйста, объясните мне, что я делаю неправильно?

Вот весь мой .cpp файл:

MyString::MyString() 

{ 

char temp[] = "Hello World"; 

     int counter(0); 
     while(temp[counter] != '\0') { 
       counter++; 
     } 
     Size = counter; 
     String = new char [Size]; 
     for(int i=0; i < Size; i++) 
       String[i] = temp[i]; 

} 

MyString::MyString(char *message) 

{ 

     int counter(0); 

     while(message[counter] != '\0') { 

     counter++; 

    } 

     Size = counter; 

     String = new char [Size]; 


     for(int i=0; i < Size; i++) 

      String[i] = message[i]; 

} 

MyString::~MyString() 

{ 

     delete [] String; 

} 

int MyString::Length() 

{ 
       int counter(0); 

       while(String[counter] != '\0') 
      { 
        counter ++; 
      } 

       return (counter); 
} 

void MyString:: Set(int index, char b) 

{ 

     if(String[index] == '\0') 

      { 
        exit(0); 
      } 

     else 

     { 

        String[index] = b; 
      } 


} 

void MyString::Copy(MyString& one) 

{ 

     one = String; 


} 

char MyString:: Get(int i) 
{ 

      if(String[i] == '\0') 
      { 
        exit(1); 
      } 
      else 
      { 

        return String[i]; 

      } 
} 



void MyString::Print() 

{ 

     for(int i=0; i < Size; i++) 

      cout << String[i]; 

      cout << endl; 


} 
+1

'void MyString :: Copy' - это функция-член, а не конструктор копирования. У конструктора копии будет подпись 'MyString :: MyString (const MyString & other)' и тип возврата вообще, даже 'void'. – dasblinkenlight

+0

Вот мои инструкции для моего профессора: объект MyString должен иметь метод Copy (...), который копирует один объект в другой. Я получаю 2 путаных? – user964141

+0

@ user964141 Да, метод копирования - это не то же самое, что и конструктор копирования. – bames53

ответ

1

void Copy(MyString& one); не конструктор копирования, но я предполагаю, что все, что вам нужно, это функция, которая делает копирование.

Реализация:

void MyString::Copy(MyString& one) { 
    one = String; 
} 

Это принимает String, что бы это, вероятно, ваши классы внутренней памяти, и назначить ему строку, которую вы пройти в ...

Это означает, что, как String2.Copy(String1) делает String1 = String2.String. Ваш желаемый результат указывает, что вы хотите скопировать String1 в String2, но вы идете совершенно неправильно.

Кроме того, тот факт, что это присвоение приводит к частичной копии («является тестом»), означает, что, как бы то ни было, это назначение также нарушено. Вы не показываете реализацию этого, поэтому я не могу сказать вам, как он сломан.


Есть много проблем с кодом. Вероятно, вам стоит пережить это с другим учеником или TA. Но по конкретным вопросам, которые вы видите на выходе, вы должны посмотреть на три вещи. Сначала google «правило трех». Во-вторых, рассмотрим, что означает «=», когда левая сторона является объектом MyString, а правая сторона - char *. В-третьих, как только вы выясните, как именно данные будут скопированы, измените направление назначения (например, *this = out.String), чтобы вы копировали в правильном направлении.

+0

Вы абсолютно правы. Вот мой весь код: – user964141

+0

@ user964141 Вы можете изменить свой вопрос выше, чтобы добавить свой код. – bames53

+0

отлично! Я добавил – user964141

Смежные вопросы