J'essaie d'utiliser G ++ pour compiler du code C++. Il semble fonctionner correctement dans d'autres compilateurs, mais pour une raison quelconque, G ++ ne produira pas de sortie de travail.C++ en G ++ - Erreur de segmentation lors de l'utilisation de pointeurs
Divulgation: Cela fait partie d'un devoir, mais je pense que c'est plus un problème de compilateur, car cela fonctionne dans d'autres compilateurs.
est ici l'extrait qui a fait des ravages:
set<int> t1, t2;
Il est étrange parce que le code suivant fonctionne très bien:
set<int> *t1 = new set<int>();
set<int> *t2 = new set<int>();
D'accord, je dois utiliser ->
au lieu de .
, mais ce qui est attendu. Le premier extrait génère une erreur de segmentation lors de l'exécution. La seconde fait intuitivement ce que je m'attendais à.
Quoi qu'il en soit, dans les coulisses, le .cpp
pour set
a ceci:
#include <cstdlib>
#include <iostream>
using namespace std;
template <class T>
set<T>::set() : bag<T>() {}
template <class T>
set<T>::set(const set<T>& b) : bag<T>(b) {}
Le .h
ressemble à ceci:
#include "bag.h"
template <class T>
class set : public bag<T>
{
public:
set();
set(const set &b);
// ...
};
#include "set.cpp"
Et last but not least, les fichiers bag.cpp
et bag.h
ressemble ceci:
using namespace std;
template <class T>
bag<T>::bag() {
head = NULL;
}
template <class T>
bag<T>::bag(const bag<T>& b) {
// ...
}
et bag.h
:
template <class T>
class bag
{
public:
bag();
bag(const bag &b);
// ...
};
#include "bag.cpp"
Encore une fois, je me sens comme G ++ me déteste juste, mais là encore je pourrais faire quelque chose de stupide. Juste un simple coup de pouce dans la bonne direction serait génial.
'Utiliser l'espace de nom std' combiné avec le fait de nommer votre classe de la même façon qu'un nom de bibliothèque standard (' set') ne peut que se terminer en larmes. –
Que font exactement les destructeurs de 'set' et' bag'? (Lorsque vous créez un objet dans la pile comme dans le premier fragment de code, l'objet est détruit à la fin de son bloc englobant la portée.Lorsque vous créez dynamiquement un objet en utilisant 'new' comme dans le second extrait de code, l'objet est détruit quand vous le "supprimez".Si vous ne le supprimez jamais, le destructeur ne sera jamais appelé; Je suppose que quelque chose dans le destructeur est probablement la cause de votre problème ' psychic-debugging>'). –
@James: J'ai renommé la classe en 'discret_set'. Aucun effet. Quant au destructeur, il itère une liste chaînée et supprime la valeur de chaque nœud. Rien d'extraordinaire, mais je vais bricoler et vous faire savoir. Merci pour l'instant! – mattbasta