Форум программистов, компьютерный форум CyberForum.ru

Конструктор копирования - C++

Восстановить пароль Регистрация
 
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
16.01.2013, 19:50     Конструктор копирования #1
Привет
Подскажите пожалуйста, как правильно сделать конструктор копирования.

Заголовки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class String {
public:
    char *Data;
};
 
class TenString:  private String{
    int a;
public:
       
       TenString();
       TenString(char *);
       TenString(const TenString &);
       ~TenString();
       
       // methods
       void ShowData();
       bool isDigital();
       bool comparing(char);
       int toInt(char *);
       char* toString(int); 
       
       TenString& operator= (const TenString &);
       TenString operator- (TenString & _r_oper);
};
Конструктор копии:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TenString::TenString(char *_Data) {
    Data = new char[strlen(_Data)+1]; 
    strcpy(Data, _Data);
    if(isDigital()) {
        if(_Data[0] == 45 || _Data[0] == 43) {
            delete [] Data;
            Data = new char[strlen(_Data)+1];
            strcpy(Data, _Data);
        } else {
            delete [] Data;
            Data = new char[strlen(_Data)+2];
            strcpy(Data, "+");
            strcat(Data, _Data);    
        }
    } else {
        delete [] Data;
        Data = new char[2];
        strcpy(Data, "0\0");            
    }
}
Почему так мудрено :
в задаче нужно создать десятичную строку. то есть строку, в которой содержаться только числа. знаковые.
то есть на первом месте может быть +, - или ничего не стоит, просто цифра.
Скажите, будет ли этот конструктор работать правильно?
Ну и предвещая ответ.
Как исправить?
+ не работает в одном пункте.
при пегрузке оператора +.
C++
1
2
3
4
5
6
TenString TenString:: operator- (TenString & _r_oper) {
    int data;
    data = toInt(Data) - toInt (_r_oper.Data);
    cout << endl << "Debug: " << data << endl;
    return TenString(toString(data)); 
}
data выводит правильное, но результат (содержимое получившегося после сложения класса 0)

C++
1
2
3
4
5
6
7
8
9
10
int main(int argc, char *argv[])
{
    TenString Bob("5555");
    TenString Private("5554");
    TenString Result;
    (Bob - Private).ShowData();
    system("PAUSE");
    
    return EXIT_SUCCESS;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
16.01.2013, 20:00     Конструктор копирования #2
VladSharikov, это не конструктор копии. Конструктор копии это:
C++
1
TenString(const TenString &);
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
16.01.2013, 21:06  [ТС]     Конструктор копирования #3
Виноват.
Конструктор копии :
C++
1
2
3
4
TenString::TenString(const TenString &_object) {
    Data = new char[strlen(_object.Data)+1];
    strcpy(Data, _object.Data);
}
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.01.2013, 21:48     Конструктор копирования #4
дебажить надо. может у вас toInt не работает как надо.

и еще о сигнатурах. такой код не будет компилироватся из-за плохой сигнатуры оператора -:
C++
1
2
3
const TenString Bob("5555");
const TenString Private("5554");
(Bob - Private).ShowData();
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
16.01.2013, 22:07  [ТС]     Конструктор копирования #5
Цитата Сообщение от DU Посмотреть сообщение
о сигнатурах
что вы имеете в виду?
код компилируется в последнем Dev-CPP даже без предупреждений.

откуда вы взяли приставки const?

в DevCPP почему-то дебаг не работает (по крайней мере в Lazarus и Visual Studio получается дебажить нормально.
Но методом научного вывода промежуточного результата выяснил, что toInt, toString работают нормально.
Могу приложить апплет, сделаете это сами.
Добавлено через 27 секунд
А , вы имете в виду, что с ними не будет работать?
Что нужно исправить для того чтобы работало?
и все равно поподробнее, пожалуйста
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.01.2013, 22:14     Конструктор копирования #6
компилироваться не будет. да, консты я воткнул специально, чтобы вы там у себя ошибки увидели.
почему у вас конструктор копирования и оператор = принимают объект по константной ссылке, а оператор минус - нет?
но проблема с нулем конечно же не из-за этого. чтобы узнать, почему вычитание работает криво - нужно дебажится. ну или весь код сюда выкладывайте
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 22:21     Конструктор копирования
Еще ссылки по теме:

C++ Конструктор копирования
C++ Конструктор копирования
C++ Конструктор копирования
C++ Конструктор копирования
Конструктор копирования C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
16.01.2013, 22:21  [ТС]     Конструктор копирования #7
Попробуйте сами, если есть время.
Дебагер в DevCPP не работает у меня (или я не понимаю как), а компилятор VS 2010/2012 не компилит, выдает стремные ошибки какие-то, в прошлый раз только снос винды помог ((.

Цитата Сообщение от DU Посмотреть сообщение
почему у вас конструктор копирования и оператор = принимают объект по константной ссылке, а оператор минус - нет?
потому что DevCPP жаловался на строку с прототипом оператор-, я не понял на что именно, убрал const. Потом понял, что devcpp не разрешает послать в функцию-член 2 параметра и просто забыл вернуть на место. Вернул. Спасибо.

Вкладываю код.
header.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#pragma once
 
class String {
public:
    char *Data;
};
 
class TenString:  private String{
    int a;
public:
       
       TenString();
       TenString(char *);
       TenString(const TenString &);
       ~TenString();
       
       // methods
       void ShowData();
       bool isDigital();
       bool comparing(char);
       int toInt(char *);
       char* toString(int); 
       
       TenString& operator= (const TenString &);
       TenString operator- (const TenString & _r_oper);
};
header.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "header.h"
 
#include <iostream>
using namespace std;
#include <stdio.h>
 
TenString::TenString() {
    Data = new char[2];
    strcpy(Data, "0\0");
}
TenString::TenString(char *_Data) {
    Data = new char[strlen(_Data)+1]; 
    strcpy(Data, _Data);
    if(isDigital()) {
        if(_Data[0] == 45 || _Data[0] == 43) {
            delete [] Data;
            Data = new char[strlen(_Data)+1];
            strcpy(Data, _Data);
        } else {
            delete [] Data;
            Data = new char[strlen(_Data)+2];
            strcpy(Data, "+");
            strcat(Data, _Data);    
        }
    } else {
        delete [] Data;
        Data = new char[2];
        strcpy(Data, "0\0");            
    }
}
TenString::TenString(const TenString &_object) {
    Data = new char[strlen(_object.Data)+1];
    strcpy(Data, _object.Data);
}
TenString::~TenString() {
    delete [] Data;
}
void TenString::ShowData() {
    int digit = toInt(Data);
    strcpy(Data, toString(digit));
    cout << Data; 
}
bool TenString::comparing(char symbol) {
      int i = 48;
      bool result = false;
      for(int i = 48; i < 58; i++) {
              if(i == symbol) 
                   result = true;
      }
      return result;
}
bool TenString::isDigital() {
    bool result, test_1, test_2;
    int i = 1;
    if(Data[0] == 43 || Data[0] == 45 || comparing(Data[0])) {
        test_1 = true;
    }
    while(comparing(Data[i]) && i < strlen(Data)+1) {
        i++;
    }   
    if(i == strlen(Data)) {
        test_2 = true;
    }
    /*  debug
    if(test_1) {
        printf("test 1 passed\n");
    } else {
        printf("test 1 not passed\n");
    }   
    if(test_2) {
        printf("test 2 passed\n");
    } else {
        printf("test 2 not passed\n");
    }
    */
    result = test_1 * test_2;
    return result;
}
 
char* TenString::toString(int _number) {
    char result[255];
    return (itoa(_number, result, 10));
}
 
int TenString::toInt(char *_string) {
    return atoi(_string);
}
 
TenString& TenString::operator=(const TenString &_r_oper) {
    if (this == &_r_oper) {
        return *this;
    }
    delete [] Data;
    Data = new char[strlen(_r_oper.Data)+1];
    strcpy(Data, _r_oper.Data);          
} 
 
TenString TenString:: operator- (const TenString & _r_oper) {
    int data;
    data = toInt(Data) - toInt (_r_oper.Data);
    cout << endl << "Debug: " << data << endl;
    return TenString(toString(data)); 
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
#include "header.h"
 
int main(int argc, char *argv[])
{
    TenString Bob("5555");
    TenString Private("5554");
    TenString Result;
    (Bob - Private).ShowData();
    system("PAUSE");
    
    return EXIT_SUCCESS;
}
Добавлено через 59 секунд
Вообще просмотрите конструкторы/деструкторы.
В соседней теме меня пилили по поводу того, что я везде подсчитываю размер и выделяю строкам только такое кол-во памяти. Этого делать не нужно? Я что-то делаю не так?
В общем просмотрите, если не сложно. Нужно мнение опытного дядьки
Yandex
Объявления
16.01.2013, 22:21     Конструктор копирования
Ответ Создать тему
Опции темы

Текущее время: 21:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru