0 / 0 / 0
Регистрация: 05.08.2017
Сообщений: 45
1

Ошибка при выполнении оператора присваивания производного класса через указатель на базовый

14.05.2018, 11:58. Показов 1251. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, не могу понять из-за чего ошибка.
Надо в производном классе объявить оператор сложения и обратится к нему через базовый.
Код базового класса
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
class Str {
 
public:
    int N;
    char* content;
    virtual void InLowercase() {};
    virtual bool IsNegative() { return 0; }
    virtual Str operator+ (Str &a) { return *this; }  // объявление оператора в базовом классе
    virtual Str* operator= (Str &a) { return this; }
    virtual bool operator< (Str &a) { return 1; }
    virtual char operator[] (int a) { return 0; }
    Str() {
        N = 1;
        content = new char[N];
        content[0] = '\0';
    }
 
    Str(char *ch) {
        N = strlen(ch) + 1;
        content = new char[N];
        for (int i = 0; i < N - 1; i++)
            content[i] = ch[i];
        content[N - 1] = '\0';
    }
 
    Str(char ch) {
        N = 2;
        content = new char[N];
        content[0] = ch;
        content[N - 1] = '\0';
 
    }
 
    Str(const Str & object)
    {
        content = new char[object.N];
        N = object.N;
        for (int i = 0; i<object.N; i++)
            content[i] = object.content[i];
    }
 
    ~Str() {
        delete[] content;
    }
 
    bool IfNULL() {
        if (content[0] == '\0') {
            return true;
        }
        else {
            return false;
        }
    }
};
Код производного класса:
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
class StrInd : public Str {
private:
    bool IsInd(char *ch) {
        bool first = 0;
        bool second = 1;
        if (((ch[0] > 64) && (ch[0] < 91)) || ((ch[0] > 96) && (ch[0] < 123)) || ch[0] == 95)
            first = 1;
        for (int i = 0; i < strlen(ch); i++)
            if (!(((ch[i] > 64) && (ch[i] < 91)) || ((ch[i] > 96) && (ch[i] < 123)) || ((ch[i] > 47) && (ch[i] < 58)) || ch[i] == 95))
                second = 0;
        if (first && second) {
            return 1;
        }
        else
        {
            return 0;
        }
    }
 
    bool IsInd(char ch) {
        bool first = 0;
        if (((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z')) || ch == '_')
            first = 1;
        if (first) {
            return 1;
        }
        else {
            return 0;
        }
    }
public:
    StrInd() : Str() {}
    StrInd(const Str & object) : Str(object) {}
    StrInd(char *ch) {
        if (IsInd(ch)) {
            N = strlen(ch) + 1;
            content = new char[N];
            for (int i = 0; i < N - 1; i++)
                content[i] = ch[i];
            content[N - 1] = '\0';
        }
        else {
            StrInd();
        }
    }
 
    StrInd(char ch) {
        if (IsInd(ch)) {
            N = 2;
            content[0] = ch;
            content[N - 1] = '\0';
        }
        else {
            StrInd();
        }
    }
 
    void InLowercase() {
        for (int i = 0; i < N; i++) {
            if ((content[i] < 91) && (content[i] > 64))
                content[i] += 32;
        }
    }
 
    StrInd* operator= (StrInd& st) {
        N = st.N;
        content = st.content;
        return this;
    }
    Str* operator= (Str &st) {
        return operator=(dynamic_cast<StrInd&>(st));
    }
 
    StrInd operator+ (const StrInd& st) {  // объявление оператора в производном классе
        StrInd* NewStr = new StrInd(content);
        char a;
        NewStr->N = N + st.N;
        for (int i = N-1; i < st.N + N - 1; i++) {
            a = NewStr->content[i];
            int g = i - (N - 1);
            NewStr->content[i] = st.content[i - (N-1)];
        }
        return *NewStr;
 
    }
 
    Str operator+ (Str &st) {
        return operator+(dynamic_cast<StrInd&>(st));  // вызов оператора
    }
    char operator[] (int n) {
        return this->content[n + 1];
    }
    ~StrInd() {
        delete content;
    }
};
Фрагмент использования оператора:
arr - массив указателей на указатели на базовый класс
Str * * arr;
C++
1
2
3
4
5
6
7
8
9
10
11
if (typeid(*arr[int(this->numericUpDown3->Value) - 1]) == typeid(StrInd) && typeid(*arr[int(this->numericUpDown2->Value) - 1]) == typeid(StrInd)) {
                    
                    delete arr[int(this->numericUpDown7->Value) - 1];
                    arr[int(this->numericUpDown7->Value) - 1] = a;
                    this->listBox1->Items[int(this->numericUpDown7->Value) - 1] = (int(this->numericUpDown7->Value)) + ": " + gcnew String(arr[int(this->numericUpDown7->Value) - 1]->content);
                    addinfo(arr[int(this->numericUpDown7->Value) - 1]->content);
                    addinfo(typeid(*arr[int(this->numericUpDown7->Value) - 1]).name());
                }
                else
                    error(4);
                break;
При выполнении строки: Str * a = &(*arr[int(this->numericUpDown2->Value) - 1] + *arr[int(this->numericUpDown3->Value) - 1]); выдаёт ошибку на картинке.
Не пойму в чём может быть ошибка.
Миниатюры
Ошибка при выполнении оператора присваивания производного класса через указатель на базовый  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2018, 11:58
Ответы с готовыми решениями:

Вызов метода производного класса через указатель на базовый класс
Всем привет ! Подскажите почему , при выполнении строки 45 я получаю ошибку ? А именно при...

Создать копию объекта производного класса зная указатель на базовый
Добрый день! Вопрос в следующем... Возможно ли создать копию объекта производного класса зная...

Доступ функциям производного класса через базовый
В общем, я только изучаю С++ и не могу понять. Как можно получить доступ к функциям из объекта...

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

2
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
14.05.2018, 12:08 2
virtual Str* operator= (Str &a)
Разве это допустимо? Нужно же определять
C++
1
virtual Str& operator= (Str &a)
1
0 / 0 / 0
Регистрация: 05.08.2017
Сообщений: 45
14.05.2018, 13:48  [ТС] 3
TRam_, Спасибо, помогло. Но теперь при повторном присваивании (присваивание результату операции +) выдаёт ошибку:
Миниатюры
Ошибка при выполнении оператора присваивания производного класса через указатель на базовый  
0
14.05.2018, 13:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2018, 13:48
Помогаю со студенческими работами здесь

Какое значение получит переменная p при выполнении следующего оператора присваивания?
var p: set of 0..9; i, j: integer; Если i=2 и j=5, то какое значение получит переменная p при...

Класс: как обратиться к методу производного класса через итератор на базовый класс?
Есть абстрактный и два порожденных. Хочу создать например list&lt;Base*&gt; list1; затем добавляю себе...

Ошибка в вводе данных из HTML и переносе их в JavaScript, при выполнении оператора IF или оператора swithc
доброго времени суток, при выполнении одной учебной задачи столкнулся с проблемой: при введении...

Возможно ли указатель производного класса инициализировать объектом базового класса?
имеется связка наследуемых классов A-&gt;B а от B наследуются одновременно еще два класса B-&gt;C и B-&gt;D...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru