Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Заблокирован
1

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

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

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
#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

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

Всем заранее благодарен.
Всем творческих удач!!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2012, 19:28
Ответы с готовыми решениями:

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

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

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

Массив указателей на объекты разных типов
Здравствуйте. К примеру, есть такая конструкция (приведена часть кода) // --- enum MyClasses ...

9
DU
1500 / 1146 / 165
Регистрация: 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 {...};
 
// еще ошибка - это невиртуалный деструктор базового класса. с невиртуальным будет комплится,
// но при этом возможны утечки или неправильная работа в целом. Деструкторы производных классов
// не будут вызываться.
0
Заблокирован
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;

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

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

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

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

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

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

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

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

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

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

Это твой первый шаг в сторону понимания вопроса.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
22.04.2012, 13:45 7
Цитата Сообщение от IFree Host Посмотреть сообщение
Проф задал написать парсер простых математических выражений с использованием скобок.
вот тебе примитивный парсер выражения http://www.dreamincode.net/for... oop-style/
1
DU
1500 / 1146 / 165
Регистрация: 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 нет. Поэтому компилятор и ругается.
1
Заблокирован
22.04.2012, 14:04  [ТС] 9
Ага, то есть, все-таки у сабклассов должны быть такие же функции как и у базового класса!
Вот спасибо!!! А если есть методы не входящие в базовый класс, к ним можно как-то обратиться?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
22.04.2012, 14:06 10
динамически кастить (dynamic_cast<Derivated*>(base)) указатель на базу в указатель на производный. если скастилось, то у вас будет указатель как раз на производный класс. и вот у него уже можно будет позвать специфичные для него функции. Правда это кривой подход, но тем не менее, так делать можно.
1
22.04.2012, 14:06
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2012, 14:06
Помогаю со студенческими работами здесь

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

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

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

Создать массив указателей на объекты класса, описывающего насекомых
Создать массив указателей на объекты класса, описывающего насекомых (количество ног, наличие...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Что такое хорошо и что такое плохо, вид сбоку. Индивид и общество - грань не нарушения.
Hrethgir 18.01.2025
В моей личной жизни и времени, я рассуждаю категорией "хуже-лучше", в том плане, когда меня спросили например - "а зачем ты делаешь свой процессор?", то я ответил - "чтобы сделать свою жизнь лучше". . .
Передача по ссылке или по значению в Java?
InfoMaster 18.01.2025
В мире программирования на Java одним из ключевых аспектов, требующих глубокого понимания, является механизм передачи параметров в методы. Этот фундаментальный концепт часто становится источником. . .
Тернарный условный оператор в Python
InfoMaster 18.01.2025
В мире программирования существует множество инструментов и конструкций, позволяющих создавать эффективный и лаконичный код. Одним из таких инструментов является тернарный условный оператор, который. . .
Как удалить неотслеживаемые файлы из рабочего дерева Git
InfoMaster 18.01.2025
В процессе разработки программного обеспечения с использованием системы контроля версий Git часто возникает необходимость в управлении неотслеживаемыми файлами. Неотслеживаемые файлы (untracked. . .
Что делает код if __name__ == "__main__": в Python
InfoMaster 18.01.2025
В мире программирования на Python существует множество важных концепций, и одной из наиболее интересных является конструкция if __name__ == "__main__". Эта специальная конструкция играет ключевую. . .
Как заставить Git забыть об отслеживаемом файле, добавленном в .gitignore
InfoMaster 18.01.2025
В мире разработки программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, позволяя эффективно отслеживать изменения в коде и управлять ими. Однако. . .
Что означает use strict в JavaScript и для чего используется
InfoMaster 18.01.2025
В мире современной веб-разработки JavaScript играет ключевую роль как один из основных языков программирования. По мере его эволюции возникла необходимость в механизмах, которые помогли бы. . .
Как работать со скрытыми (hidden) элементами в jQuery
InfoMaster 18.01.2025
В современной веб-разработке управление видимостью элементов на странице является одним из ключевых аспектов создания интерактивных пользовательских интерфейсов. jQuery предоставляет мощный набор. . .
Как переключаться между ветками (Branch) с помощью checkout в Git
InfoMaster 18.01.2025
Ветки в Git являются одной из ключевых концепций для управления версионностью кода, позволяя разработчикам эффективно работать в команде и параллельно развивать программные проекты. Каждый новый. . .
Что такое стек и куча, чем они отличаются и где находятся
InfoMaster 18.01.2025
Понимание основных концепций памяти в программировании В мире современного программирования эффективное управление памятью играет ключевую роль в создании производительных и надежных приложений. . . .
Как использовать комментарии в JSON
InfoMaster 18.01.2025
JSON (JavaScript Object Notation) представляет собой легкий и широко используемый формат обмена данными, который стал стандартом де-факто для веб-приложений и программных интерфейсов. При работе с. . .
Как заставить git pull перезаписать локальные файлы в Git
InfoMaster 18.01.2025
Проблема перезаписи локальных файлов в Git При работе с системой контроля версий Git разработчики часто сталкиваются с ситуацией, когда необходимо синхронизировать локальный репозиторий с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru