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

Работа с абстрактным классом

07.01.2016, 21:42. Показов 1827. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Имеется небольшой класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <irrlicht.h>
 
class EngineInit
{
public:
    IrrlichtDevice* device = 0;
    ISceneManager* smgr = 0;
    IVideoDriver* driver = 0;
    IGUIEnvironment* guienv = 0;
 
    ILightSceneNode* sun;
    vector3df pos;
 
    int initialise();
};
C++
1
2
3
4
5
int EngineInit::initialiseEngine()
{
    driver = device->getVideoDriver();
    guienv = device->getGUIEnvironment();
}
Выдает сегфолт на driver = device->getVideoDriver(). Известно, что классы IrrlichtDevice и далее -- абстрактные. Я прекрасно понимаю, что пишу программу неправильно.
Если же исключить ООП и писать реализацию напрямую в функции main, то проблемы не наблюдается.
Как нужно исправить программу, чтобы не получать сегфолт?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2016, 21:42
Ответы с готовыми решениями:

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

Непонятки с абстрактным классом
У нуба возник вопрос :) Вот объявляю я абстрактный Inline класс. Ну под инлайн я имею ввиду, что он без cpp, реализация в H. #pragma...

Ошибка при работе с абстрактным классом pair
Всем доброго времени суток, стоит задача создать абстрактный класс pair и создать от него производный класс complex, определив при этом...

34
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
10.01.2016, 17:39
Студворк — интернет-сервис помощи студентам
Разыменование будет, просто в большинстве случаев при передаче this в метод - это пустая операция. В большинстве случаев, но не во всех.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
10.01.2016, 17:52
Цитата Сообщение от avgoor Посмотреть сообщение
но не во всех.
вот рабочий пример бы подтвердил твои слова

Добавлено через 3 минуты
P.S. кроме вызова виртуального метода
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
10.01.2016, 17:56
C++
1
2
struct foo {
    bool is_valid() { return this;}
Это будет работать, пока кто-то не определит operator->.
Для подсчета числа обращений, например.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
10.01.2016, 17:58
Цитата Сообщение от avgoor Посмотреть сообщение
Это будет работать
что будет работать и при чем тут оператор ->? Мы про вызов метода через nullptr говорим.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
10.01.2016, 18:02
Цитата Сообщение от Kastaneda Посмотреть сообщение
что будет работать
Вызов is_valid() от нулевого указателя.
А если определен operator-> и он, например, изменяет какой-нибудь mutable?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
10.01.2016, 18:06
Цитата Сообщение от avgoor Посмотреть сообщение
Вызов is_valid() от нулевого указателя.
А если определен operator-> и он, например, изменяет какой-нибудь mutable?
Это не совсем то, что здесь обсуждается.
Ок, представим, что обсуждаем такой вариант
C++
1
2
app *ptr = nullptr;
(*ptr).is_valid();
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
10.01.2016, 18:16
Цитата Сообщение от Kastaneda Посмотреть сообщение
(*ptr).is_valid();
Заставить всех вызывать is_valid() именно так?
Ну и не понятно зачем делать нестатическим метод, который по сути статический?
0
10.01.2016, 18:20

Не по теме:

Цитата Сообщение от avgoor Посмотреть сообщение
Заставить всех вызывать is_valid() именно так?
Ну и не понятно зачем делать нестатическим метод, который по сути статический?
мы о разных вещах говорим. Если перечитать тему сначала будет понятна суть дискуссии

0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
10.01.2016, 18:25
Цитата Сообщение от avgoor Посмотреть сообщение
(*ptr)
Ну, если здесь нет разыменования...
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
10.01.2016, 18:30
Цитата Сообщение от avgoor Посмотреть сообщение
Ну, если здесь нет разыменования...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
class A
{
public:
  void f()
  {
    std::cout << "f()" << std::endl;
  }
};
 
int main()
{
  A *a = nullptr;
  (*a).f();
}
https://ideone.com/6uSx5q
0
10.01.2016, 18:49

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
не хочу приводить рабочий пример и ассемблерный выхлоп потому что:
во-первых, я с вами не спорю.

а во-вторых,
причем здесь вообще ассемблерный выхлоп?

сейчас вы мне напомнили человека,
который удивлялся:
почему это компилятор ругается на приватный конструктор копии,
если по факту, он оптимизировал его вызов?

синтаксис первичнее любых оптимизаций,
неужели это так сложно понять?

сначала компилятор сделает разыменование:
вычислит выражение, и только потом будет думать,
как это можно оптимизировать.

0
10.01.2016, 18:52

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
синтаксис первичнее любых оптимизаций,
неужели это так сложно понять?
это да, но имхо - описанное в стандарте ptr-> - (*ptr). это семантика, которая не нарушается при использовании thiscall (и позднее конвенции x86_64).

0
10.01.2016, 19:02

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
которая не нарушается при использовании thiscall
при чем здесь thiscall?

в точке, где разыменовывается нулевой указатель,
происходят многочисленные нарушения стандарта.

все, что происходит после - это уже UB

0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
10.01.2016, 21:47
Цитата Сообщение от avgoor Посмотреть сообщение
Ну, если здесь нет разыменования...
Буду спорить с тем кто так не считает...
Здесь есть разименование с точки зрения языка.
Здесь нет разименования с точки зрения оптимизации компилятора.

Давайте поспорим.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
10.01.2016, 22:55
Опять эта тема Ну просто не могу снова не вставить очередной вариант, к которому я все же склоняюсь больше других. В выражении *ptrnull разыменование есть, UB нету. Любой вызов нестатической функции-члена через nullptr - UB, а статической - не UB.

hoggy, если просто разыменование - UB, то как ты объяснишь следующие два факта?
1)
If the glvalue expression is obtained by applying the unary * operator to
a pointer and the pointer is a null pointer value (4.10), the typeid expression throws an exception (15.1)
of a type that would match a handler of type std::bad_typeid exception (18.7.3).
То есть типа по-твоему нормально, что *ptr - UB, а если к этому UB еще потом применить и typeid, то это уже well-defined?

2)
Вот принятая поправка в стандарт:
http://www.open-std.org/jtc1/s... .html#1102
Она говорит о том, что комитет не считает, что это однозначно UB. Иначе зачем ему ее принимать, м?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2016, 22:55
Помогаю со студенческими работами здесь

Создать иерархию наследования с абстрактным базовым классом
Доброго времени суток! Помогите, пожалуйста, сделать: 2) Создать абстрактный базовый класс с виртуальной функцией &quot;Площадь&quot;....

Работа с классом
Работа с классом, карточку отдела кадров(обеспечить вывод на экран в удобном виде, печать сообщения при достижении пенсионного возраста)....

работа с классом
пишу класс быстрой математики (знаю что многие делали в инете дофига всего, но всё же) сделал таблицу корней в общем то всё работает...

Работа с классом
Необходимо написать класс который будет переводить из 16-ой системы счисления числа в 10-ю систему счисления, классы только неделю назад...

работа с классом
Напсал код: #include &lt;IOSTREAM&gt; #include &lt;fstream&gt; #include &quot;rus.h&quot; #include &quot;work.h&quot; using namespace std; class Temperatura ...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru