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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
IFree Host
Заблокирован
#1

Массив указателей на объекты подклассов - C++

21.04.2012, 19:28. Просмотров 1530. Ответов 9
Метки нет (Все метки)

Доброго времени суток всем!!!

Проф задал написать парсер простых математических выражений с использованием скобок.
Код не должен выходить за рамки изученого матерьяла и не должен использовать сторонних библиотек

Текущая проблема:

По условию задания необходимо создать базовый класс "выражение"

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
#pragma once
 
class Expression
{
    int m_wert;
 
public:
 
    Expression();
    ~Expression();
 
    void Wert(int wert);
    int Print();
};
 
#include "stdafx.h"
#include "Expression.h"
 
Ausdruck::Expression()
{
}
 
Ausdruck::~Expression()
{
}
 
void Expression::Wert(int wert) {
    m_wert = wert;
}
 
int Expression::Print() {
    return m_wert;
}

от этого класса порождаются подклассы *(в качестве примера приведу только один, они все-равно все одинаковые) "Division" "Substraktion" "Addition" "Multiplikation" "Konstante"


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 "Expression.h"
 
class Konstante : Expression{
 
    int m_wert;
 
public:
 
    Konstante();
    ~Konstante();   
 
    void Wert(int wert);
    int Print();
};
 
#include "stdafx.h"
#include "Konstante.h"
 
Konstante::Konstante()
{
}
 
Konstante::~Konstante()
{
}
 
void Konstante::Wert(int wert) {
    m_wert = wert;
}
 
int Konstante::Print() {
    return m_wert;
}

далее в парсере я пытаюсь создать массив указателей с типом базового класса

C++
1
2
3
4
5
6
7
struct expressionStack
{
    int top;
    Expression* stack[40];
};
 
expressionStack expression;


когда константа или оператор прочитаны, они должны быть помещены в массив в виде объекта.
Это необходимо для обработки постфиксных операций

Теперь я хоть медленно но верно подобрался к самому вопросу:

почему не получается сохранить указатель на объект сабкласса в массив?

я это пытаюсь сделать вот так

C++
1
2
    Konstante* konst = new Konstante;
    expression.stack[ausdruck.top] = konst;

и получаю ошибку

'conversion type' conversion from 'type1' to 'type2' exists, but is inaccessible

Будьте добры, объясните почему данный вариант не работает, и что нужно сделать чтобы заработало

Всем заранее благодарен.
Всем творческих удач!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2012, 19:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив указателей на объекты подклассов (C++):

Массив указателей на объекты - C++
Доброго времени суток. В моем коде базовый класс имеет два наследника. Четвертый класс содержит динамический массив указателей на...

Динамический массив указателей на объекты - C++
вообщем была тут на форуме задача, в подробности вдаваться не буду, смысл сейчас заключается в том, чтобы создавать в цикле объекты, и в их...

Динамический массив указателей на объекты класса - C++
Добрый вечер! Нужна помощь У меня имеется класс STROKA(вроде уже готовый,и все хорошо) Только вот никак не могу понять, как создать...

Как понять: массив указателей на объекты классов? - C++
если приведете пример буду рад.

Указатель на массив указателей на объекты, передать в метод объекта - C++
Здравствуйте! Нужно решить задачу, есть такой класс. class MyClsDisk { public: void...

Виртуальные функции (создать массив указателей на объекты трех классов) - C++
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не переопределяется. В данном коде вводится 3 элемента в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.04.2012, 19:57 #2
C++
1
2
3
4
5
6
7
8
9
// у вас приватное наследование:
class Konstante : Expression {...};
 
// нужно явно указать , что наследовние публичное. т.е:
class Konstante : public Expression {...};
 
// еще ошибка - это невиртуалный деструктор базового класса. с невиртуальным будет комплится,
// но при этом возможны утечки или неправильная работа в целом. Деструкторы производных классов
// не будут вызываться.
IFree Host
Заблокирован
22.04.2012, 13:12  [ТС] #3
Большое спасибо!!! Сразу все заработало!!!

Добавлено через 17 часов 12 минут
По ходу возник еще один вопрос. Тема для меня совсем новая, еще трудно сориентироваться что к чему, поэтому нужна помощь.

В коде я присваиваю массиву базового класса сабкласс и пытаюсь обратиться к методу сабкласса

expression.stack[ausdruck.top] = new Multiplikation;
expression.stack[ausdruck.top]->getMembers(expression.stack[expression.top-2], expression.stack[expression.top-1]);

однако, компилятор ругается на getMembers и говорит, что это не метод класса expression
то есть получается он не создает объект сабкласса а создает объект базового класса, хотя я и говорю

expression.stack[ausdruck.top] = new Multiplikation;

Но почему? Тут я совсем перестаю понимать как что происходит.

Заранее благодарен за помощь
Bers
Заблокирован
22.04.2012, 13:14 #4
http://www.programmersclub.ru/38/
IFree Host
Заблокирован
22.04.2012, 13:29  [ТС] #5
Слушай, Bers,

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

Практика и теория иногда разделены границей понимания, через которую нужно выстроить мост.
Ты стоишь на той стороне а я на этой. Я тебя прошу положить доску что бы я мог перейти, а ты в ответ кидаешь в меня камень. Приблизительно так это выглядит.

Я прочел о полиморфизме в трех разных книгах, но что-то понимание пока очень абстрактно.
Я конечно, уверен, что если я прочту то же самое еще в 4-5 местах я скороее всего все пойму, но боюсь, что проект мой встрянет на долго, а вот профессор меня не поймет.

Добавлено через 5 минут
Вот, например, чтобы еще больше сузить круг непоняток.

Я так нигде и не смог вычитать, является ли необходимым условием, что бы в сабклассе были определены все те же функции, что и в базовом классе? Или в сабклассе их может быть больше?
Bers
Заблокирован
22.04.2012, 13:42 #6
Цитата Сообщение от IFree Host Посмотреть сообщение
однако, воспринимаю это как намек
Читать намёки - полезное умение, если общаешься с девочками.
Но если речь идет о программировании, то здесь уже нет места намекам. Все предельно четко и конкретно.

Цитата Сообщение от IFree Host Посмотреть сообщение
Практика и теория иногда разделены границей понимания, через которую нужно выстроить мост.
Возьми учебный работоспособный пример, и проанализируй его. Если что-то будет не понятно - спрашивай. Спрашивай о логике конкретного работоспособного простейшего примера.

Самый простой способ понять теорию - суметь применить её на практике.

А что бы суметь применить, нужно понять область применения механизма.

Это твой первый шаг в сторону понимания вопроса.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.04.2012, 13:45 #7
Цитата Сообщение от IFree Host Посмотреть сообщение
Проф задал написать парсер простых математических выражений с использованием скобок.
вот тебе примитивный парсер выражения http://www.dreamincode.net/forums/to...ser-oop-style/
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.04.2012, 14:01 #8
по поводу getMembers:
у вас в стеке хранятся указатели на Expression. Поэтому в коде вызывать только те функции, которые есть у класса Expression. Ок. Смотрим на этот класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Expression
{
    int m_wert;
 
public:
 
    Expression();
    ~Expression();
 
    void Wert(int wert);
    int Print();
};
Как видим, функции getMembers у класса Expression нет. Поэтому компилятор и ругается.
IFree Host
Заблокирован
22.04.2012, 14:04  [ТС] #9
Ага, то есть, все-таки у сабклассов должны быть такие же функции как и у базового класса!
Вот спасибо!!! А если есть методы не входящие в базовый класс, к ним можно как-то обратиться?
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
22.04.2012, 14:06 #10
динамически кастить (dynamic_cast<Derivated*>(base)) указатель на базу в указатель на производный. если скастилось, то у вас будет указатель как раз на производный класс. и вот у него уже можно будет позвать специфичные для него функции. Правда это кривой подход, но тем не менее, так делать можно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2012, 14:06
Привет! Вот еще темы с ответами:

Можно ли динамически выделить память под массив указателей, на объекты класса? - C++
Прошу прощения если не правильно назвал вопрос. Не знаю как правильно сформулировать. Можно ли строчку VisualizationTools* VT; заменить...

Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? - C++
Доброго времени суток! Рассматриваю пример (из Лафоре) сортировки массива указателей на объекты, для чего используются указатели на...

Конструктор, в аргументах которого передается массив указателей на объекты и размер этого массива - C++
Создайте новую версию класса Stack с конструктором по умолчанию и вторым конструктором, в аргументах которого передается массив указателей...

"Морской бой": массив указателей на объекты vs контейнер stl. Что лучше? - C++
Задание такое: Задача№2 Разработать программу «Морской бой», где пользователь будет видеть свои 2 игровых поля и вводить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.04.2012, 14:06
Ответ Создать тему
Опции темы

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