0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
1

Бинарное дерево подклассов основного класса-узла. Доступ к подклассам по указателю - объекту класса-родителя

29.01.2017, 16:48. Показов 589. Ответов 1

Короче, необходимо сделать бинарное дерево, решающее арифметическое выражение, предварительно туда записанное.
Есть основной класс Expression, и три дочерних Sum (сумма), Product (произведение) и Constant
Само дерево состоит из дочерних классов, классы Sum и Product имеют ветки (указатели Left и Right), классы Constant - листья дерева.

Фишка дочерних классов в том, что они должны перегружать функцию Calculate() класса-родителя под свой тип выражения (в классе Constant() эта функция возвращает константу)

А теперь сама проблема. Указатели Left и Right имеют тип Expression, в них же мы записываем адреса объектов с типами дочерних классов. И при обращении к функции Calculate() по указателю, перегрузка функции не происходит.

Класс Expression
C++
1
2
3
4
5
6
7
8
9
10
#include <string>
class Expression
{
    public:
        int Calculate() {}
        std :: string Lexeme;
    protected:
        
        
};
Класс Sum
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "Expression.h"
class Sum : public Expression
{
    public:
        Expression *Left, *Right;
        int Calculate() 
        { 
                /* здесь и далее при вызове функции выводится сообщение, чтоб можно было отследить*/
        std :: cout << "Sum nodes " << Left->Lexeme << " & " << Right->Lexeme << std::endl;  
        return Left->Calculate() + Right->Calculate(); 
        }
    protected:
};
Класс Product
C++
1
2
3
4
5
6
7
8
9
#include "Expression.h"
#include <string>
class Product : public Expression
{
    public:
        Expression *Left, *Right;
        int Calculate(){ return Left->Calculate() + Right->Calculate(); }
    protected:
};
Класс Constant
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "Expression.h"
#include <stdlib.h>
#include <iostream>
class Constant : public Expression
{
    public:
        int Calculate() { 
        int A = atoi(Lexeme.c_str());
        std :: cout << "Node with Lex " << A << std::endl;
        return A;  }
    protected:
};
main.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
#include <iostream>
#include <string>
#include "Sum.h"
#include "Product.h"
#include "Constant.h"
 
int main(int argc, char** argv) 
{
    setlocale(LC_ALL, 0);
    Sum s1, s2, s3;
    Constant c1, c2, c3, c4;
    /*Далее заполнение маленького деревца вручную*/
    c1.Lexeme = "3";
    c2.Lexeme = "1";
    c3.Lexeme = "5";
    c4.Lexeme = "10";
    s1.Lexeme = "s1";
    s2.Lexeme = "s2";
    s3.Lexeme = "s3";
    s1.Left = &c1;
    s1.Right = &s2;
    
    s2.Left = &c2;
    s2.Right = &s3;
    
    s3.Left = &c3;
    s3.Right = &c4;
    
    s1.Right->Calculate(); //Пробный запуск вычисления правой ветки
    
    std :: cout << s1.Calculate(); //Вычисление всего дерева
    return 0;
}
Итог: Пробный запуск не дал ничего, так как запустилась функция класса Expression с пустым телом
А при запуске вычисления всего дерева выполняется только функция в корне.

Есть ли способ сделать так как задумано, или же подобные чудеса будут возможны только в моём раю программиста после смерти?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.01.2017, 16:48
Ответы с готовыми решениями:

Доступ к указателю - элементу класса
Есть класс. В нем есть элемент-указатель (на голову списка). Можно ли получить как то этот...

Доступ к объекту класса
Есть 3 класса MainWindow(Основной) и 2 второстепенных Controll и Mlist. // MainWindow.h #ifndef...

Доступ к объекту класса
Всем привет, друзья! Начал изучать java. И решил по видеоуроку написать игру &quot;Змейка&quot;, автор писал...

Доступ к объекту класса
Всем привет! В h файле объявлено три класса: HeavyCar, Fuller, Emptier. Это код кнопки ПУСК: int...

1
125 / 125 / 44
Регистрация: 05.10.2013
Сообщений: 462
29.01.2017, 16:55 2
DrankUser, посмотрите виртуальные функции и абстрактные классы. Они решают вашу проблему.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2017, 16:55
Помогаю со студенческими работами здесь

Доступ к объекту чужого класса
Доброго времени суток. Есть форма и ф-я, описанная в классе Program. Эта ф-я должна обратиться к...

Доступ к объекту из другого класса
Перебрав кучу топиков и ссылок, так и не нашел решения для себя... Может кто подскажет, как...

Получить доступ к объекту класса
Добрый день. Столкнулся с такой задачей: есть список студентов с 3 оценками и суммой баллов. Ввод...

Доступ к объекту ui из другого класса
Всем привет! Из другого класса необходимо обратиться к объекту ui (textEdit) и что-нибудь вывести...

Доступ к объекту (QTcpSocket) другого класса
Доброго времени суток. Делаю tcp-клиент. Есть 2 формы: -ввод АйПи и порта для подключения к...

Доступ к объекту label класса из множества.
Допустим есть класс комментарием,в нем куча объектов label,а в них комментарии,как мне взять...


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

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

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