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

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

Восстановить пароль Регистрация
 
SanchezPluz
49 / 49 / 1
Регистрация: 31.10.2012
Сообщений: 474
07.07.2015, 22:22     Segmentation fault при наследовании класса #1
Доброго времени суток!

Имею класс 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");
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2015, 22:22     Segmentation fault при наследовании класса
Посмотрите здесь:

[C/C++] "Segmentation fault" при попытке передачи параметра командной строки. C++
C++ Segmentation fault :(
Segmentation fault при использовании модуля <time.h> C++
Segmentation fault при вызове метода C++
C++ Segmentation fault
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.07.2015, 22:46     Segmentation fault при наследовании класса #2
Цитата Сообщение от SanchezPluz Посмотреть сообщение
В данном случае ругается на map_obj и map_node.
Хотелось бы видеть:
1. Самодостаточный
2. Минимальный
3. Пример
4. Демонстрирующий
5. Конкретную
6. Ошибку.
SanchezPluz
49 / 49 / 1
Регистрация: 31.10.2012
Сообщений: 474
08.07.2015, 10:13  [ТС]     Segmentation fault при наследовании класса #3
Tulosba, вот архив с исходниками, пожалуйста. archive.zip
Если в main'е убрать функцию create, то программа запустится и будет работать. Однако, если оставить так, то все скомпилируется, но программа будет падать в функции create с сигналом SIGSEGV. Подозреваю, что дело в неправильном наследовании.

Отладчик говорит, что вся проблема в классе Environment.
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
08.07.2015, 10:25     Segmentation fault при наследовании класса #4
SanchezPluz, Ты инициализируешь объект init, но не объект env. В итоге у второго поля device, driver, smgr ничему не присвоены, и обращаться к ним нельзя.
SanchezPluz
49 / 49 / 1
Регистрация: 31.10.2012
Сообщений: 474
08.07.2015, 11:47  [ТС]     Segmentation fault при наследовании класса #5
AlexVRud, можно чуточку поподробнее? Что мне нужно сделать?
У меня же есть наследование, следовательно device, driver и smgr должны быть также участниками класса Environment. Или я не прав?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
08.07.2015, 12:05     Segmentation fault при наследовании класса #6
Цитата Сообщение от SanchezPluz Посмотреть сообщение
то программа запустится и будет работать.
Для этого как минимум не хватает файла "irrlicht.h", но дело даже не в этом.
В первую очередь стоит разобраться с концепциями объекто-ориентированного программирования. В частности с инкапсуляцией.
Т.е. данные перенести в private секцию и их инициализацию выполнять в конструкторе. В общем случае, никаких методов create(), initialise() быть не должно. Это должен делать конструктор. Пока это не станет понятно, рассуждать о наследовании мне кажется преждевременным.
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
08.07.2015, 14:26     Segmentation fault при наследовании класса #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;
}
Tulosba
08.07.2015, 14:58
  #8

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 23:30     Segmentation fault при наследовании класса
Еще ссылки по теме:

Segmentation fault C++
C++ Ошибка "Segmentation fault" при организации дерева
Segmentation fault C++

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

Или воспользуйтесь поиском по форуму:
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
08.07.2015, 23:30     Segmentation fault при наследовании класса #9
Tulosba, В данном случае, это бы усложнило понимание ТС
Yandex
Объявления
08.07.2015, 23:30     Segmentation fault при наследовании класса
Ответ Создать тему
Опции темы

Текущее время: 18:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru