Я пытаюсь использовать библиотеку OGDF C ++ для проекта и хочу использовать защищенную функцию-член класса этой библиотеки. As не может получить доступ к защищенным членам непосредственно вне класса или производного класса; чтобы использовать защищенный метод класса Balloon Layout, я создал класс A, который наследует класс BallonLayout, и из защищенной функции суперкласса вызывается в публичной функции «abc ()» класса A; так что я могу использовать abc () вне класса и косвенно защищенную функцию класса BallonLayout.
Здесь, разместив код, скажите, пожалуйста, в чем проблема?
#include <ogdf/basic/Graph.h>
#include <ogdf/basic/graph_generators.h>
#include <ogdf/misclayout/BalloonLayout.h>
using namespace ogdf;
class OGDF_EXPORT A : public BalloonLayout{
public:
void abc(const Graph &G){
selectRoot(G);
}
};
int main()
{
int n = 5, m = 7;
Graph G;
ogdf::planarBiconnectedGraph(G, n, m);
A* a;
a->abc(G);
cout << "Done!!";
return 0;
}
Он компилируется без ошибок, но во время выполнения выдает «Ошибка сегментации (ядро сброшено)». Эта ошибка возникает, когда мы пытаемся получить доступ к чему-то (объект / переменная), которого нет в памяти. Но не понимаю, какую ошибку я совершил.
Ваш код:
A* a;
a->abc(G);
не инициализирует указатель a
, Разыменование нулевого или неинициализированного указателя с помощью *
или же ->
оператор, есть неопределенное поведение.
Оказывается, вам вообще не нужен указатель, просто используйте:
A a;
a.abc(G);
И если вам нужна динамически выделяемая память, включите <memory>
и делать:
std::unique_ptr<A> a = new A(...);
a->abc(G);
Ради любви к жизни, вселенной и всему, не используйте голые указатели, когда можете.
Других решений пока нет …