Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
SanchezPluz
49 / 49 / 8
Регистрация: 31.10.2012
Сообщений: 481
1

Segmentation fault при наследовании класса

07.07.2015, 22:22. Просмотров 492. Ответов 8
Метки нет (Все метки)

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

Имею класс Initialise и класс Environment. В первом создаются экземпляры движка и прочие сопутствующие вещи. Потом эти указатели используются в других классах. Соответственно, для их использования в других классах я должен унаследовать Environment от Initialise. Однако, если я это делаю и использую уже другие самостоятельные указатели, то выходит ошибка сегментации памяти Segmentation Fault.
Прикладываю код.

Помогите решить задачу. Если я не использую наследование и просто пишу все в одном классе (например, Environment), то все прекрасно работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <irrlicht.h>
#include <iostream>
 
using namespace std;
using namespace irr;
using namespace video;
using namespace core;
using namespace scene;
 
class Initialise
{
public:
    Initialise();
 
    IrrlichtDevice* device;
    IVideoDriver* driver;
    ISceneManager* smgr;
 
    int initialiseEngine();
};
C++
1
2
3
4
5
6
7
8
9
10
11
class Environment : public Initialise
{
public:
    Environment();
    ~Environment();
    int create();
    void materialInfo();
 
    IAnimatedMesh* map_obj;
    IAnimatedMeshSceneNode* map_node;
};
В данном случае ругается на map_obj и map_node.
Пример:
C++
1
map_obj = smgr->getMesh("path");
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 22:22
Ответы с готовыми решениями:

Segmentation fault при вызове метода
Собственно такое дело, имеется следующий код: Item* m_items; ...

Segmentation fault при работе со стеком
Господа, если не затруднит, помогите пожалуйста с этой проблемой: Код...

Segmentation fault при использовании модуля <time.h>
Есть код time_t now; struct tm * ptr; static char tbuf; bzero(tbuf,64);...

Ошибка выполнения Segmentation fault при открытии файла
Привет всем! почему не открывается файл, не понимаю что такое? ubuntu 16, qt...

Ошибка "Segmentation fault" при организации дерева
Есть следующие функции Three сreateThree(Node **q) { if((*q)-&gt;p) ...

8
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.07.2015, 22:46 2
Цитата Сообщение от SanchezPluz Посмотреть сообщение
В данном случае ругается на map_obj и map_node.
Хотелось бы видеть:
1. Самодостаточный
2. Минимальный
3. Пример
4. Демонстрирующий
5. Конкретную
6. Ошибку.
0
SanchezPluz
49 / 49 / 8
Регистрация: 31.10.2012
Сообщений: 481
08.07.2015, 10:13  [ТС] 3
Tulosba, вот архив с исходниками, пожалуйста. archive.zip
Если в main'е убрать функцию create, то программа запустится и будет работать. Однако, если оставить так, то все скомпилируется, но программа будет падать в функции create с сигналом SIGSEGV. Подозреваю, что дело в неправильном наследовании.

Отладчик говорит, что вся проблема в классе Environment.
0
AlexVRud
479 / 191 / 72
Регистрация: 04.07.2014
Сообщений: 538
08.07.2015, 10:25 4
SanchezPluz, Ты инициализируешь объект init, но не объект env. В итоге у второго поля device, driver, smgr ничему не присвоены, и обращаться к ним нельзя.
0
SanchezPluz
49 / 49 / 8
Регистрация: 31.10.2012
Сообщений: 481
08.07.2015, 11:47  [ТС] 5
AlexVRud, можно чуточку поподробнее? Что мне нужно сделать?
У меня же есть наследование, следовательно device, driver и smgr должны быть также участниками класса Environment. Или я не прав?
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.07.2015, 12:05 6
Цитата Сообщение от SanchezPluz Посмотреть сообщение
то программа запустится и будет работать.
Для этого как минимум не хватает файла "irrlicht.h", но дело даже не в этом.
В первую очередь стоит разобраться с концепциями объекто-ориентированного программирования. В частности с инкапсуляцией.
Т.е. данные перенести в private секцию и их инициализацию выполнять в конструкторе. В общем случае, никаких методов create(), initialise() быть не должно. Это должен делать конструктор. Пока это не станет понятно, рассуждать о наследовании мне кажется преждевременным.
0
AlexVRud
479 / 191 / 72
Регистрация: 04.07.2014
Сообщений: 538
08.07.2015, 14:26 7
Цитата Сообщение от SanchezPluz Посмотреть сообщение
У меня же есть наследование, следовательно device, driver и smgr должны быть также участниками класса Environment. Или я не прав?
Посмотри на результат работы следующего кода:

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
#include <iostream>
 
class Foo {
public:
  Foo() : x_(1.0) {             std::cerr << "DEBUG: Constructor Foo\n"; };
  virtual ~Foo() {              std::cerr << "DEBUG: Destructor Foo\n"; };
  void setX(double x) { x_=x;   std::cerr << "DEBUG: Foo::setX(" << x << ")\n"; };
  double getX() { return x_; };
protected:
  double x_;
};
 
class Bar: public Foo {
public:
  Bar() : y_(2.0) {             std::cerr << "DEBUG: Constructor Bar\n"; };
  virtual ~Bar() {              std::cerr << "DEBUG: Destructor Bar\n"; };
  void setY(double y) { y_=y;   std::cerr << "DEBUG: Bar::setY(" << y << ")\n"; };
  double getY() { return y_; };
protected:
  double y_;
};
 
int main() {
  std::cerr << "INFO: Start program\n";
 
  std::cerr << "INFO: Declare new object: foo\n";
  Foo foo;
  std::cerr << "INFO: foo.x=" << foo.getX() << "\n";
 
  std::cerr << "INFO: Declare new object: bar\n";
  Bar bar;
  std::cerr << "INFO: bar.x=" << bar.getX() << " bar.y=" << bar.getY() << "\n";
 
  std::cerr << "INFO: Set new value to foo.x\n";
  foo.setX(10.0);
  std::cerr << "INFO: foo.x=" << foo.getX() << "\n";
  std::cerr << "INFO: bar.x=" << bar.getX() << " bar.y=" << bar.getY() << "\n";
 
  std::cerr << "INFO: Set new value to bar.x\n";
  bar.setX(20.0);
  std::cerr << "INFO: foo.x=" << foo.getX() << "\n";
  std::cerr << "INFO: bar.x=" << bar.getX() << " bar.y=" << bar.getY() << "\n";
 
  std::cerr << "INFO: Set new value to bar.y\n";
  bar.setY(30.0);
  std::cerr << "INFO: foo.x=" << foo.getX() << "\n";
  std::cerr << "INFO: bar.x=" << bar.getX() << " bar.y=" << bar.getY() << "\n";
 
  return 0;
}
0
Tulosba
08.07.2015, 14:58
  #8

Не по теме:

AlexVRud, неконстантные данные не стоит размещать в секциях, отличных от private.
И для get-методов хорошо бы добавить const.

0
AlexVRud
479 / 191 / 72
Регистрация: 04.07.2014
Сообщений: 538
08.07.2015, 23:30 9
Tulosba, В данном случае, это бы усложнило понимание ТС
0
08.07.2015, 23:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 23:30

[C/C++] "Segmentation fault" при попытке передачи параметра командной строки.
Прога вылетает при попытке передачи параметра через командную строку.Такой код:...

Segmentation fault
Кусок кода: template &lt;typename Type&gt; class Queue { private: ...

Segmentation fault
Доброго времени суток. Есть 2 класса. object class object{ void...


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

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

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