C++ クラス classA があり、 operator を介してカスタム クラス classB のオブジェクト インスタンスを動的に作成しますnew
。
私はこれを文字通り何百回も成功させてきました。ただし、この場合、this
コンストラクター内のポインターの値を確認し、非null
ポインターを返しているにもかかわらず、新しい演算子は NULL ポインターを返しています。
障害を再現する最小限の実例を複製するクラスを作成しました。ただし、この場合、オペレーターnew
は期待どおりに機能します。
私が理解していることから、これはメモリ割り当ての失敗が原因であるに違いありません。
これをトラブルシューティングする方法、どこから始めるべきか、またはこの振る舞いの原因は何かについて誰か提案がありますか?
コード全体を喜んで投稿しますが、誰も退屈させたくありません...
誰かが私を助けてくれることを願っています。
お時間をいただきありがとうございます。
更新:要求されたコードあなたの納得のために、問題が発生しているその下の方法。変数 _radice は NULL です (代入後は変更されません)。
template <class T>
void AlberoNArio<T>::inserisciRadice(tipoElemento elemento)
{
_radice==new NodoAlberoNArioLista<T>();
cout<<endl<<_radice<<endl;
}
NodoAlberoNArioLista.h
#ifndef _NODO_ALBERO_N_ARIO_LISTA_H
#define _NODO_ALBERO_N_ARIO_LISTA_H
template <class T>
class NodoAlberoNArioLista
{
public:
typedef T tipoElemento;
typedef NodoAlberoNArioLista<T>* posizione;
tipoElemento _elemento;
posizione _padre;
NodoAlberoNArioLista();
NodoAlberoNArioLista(tipoElemento, posizione);
NodoAlberoNArioLista(NodoAlberoNArioLista<T>&);
NodoAlberoNArioLista<T>& operator=(NodoAlberoNArioLista<T>&);
static const posizione POSIZIONENULLA;
};
template <class T>
const typename NodoAlberoNArioLista<T>::posizione NodoAlberoNArioLista<T>::POSIZIONENULLA=0;
template<class T>
NodoAlberoNArioLista<T>::NodoAlberoNArioLista()
{_padre=0; cout<<endl<<endl<<endl<<this<<endl<<endl<<endl;}
template<class T>
NodoAlberoNArioLista<T>::NodoAlberoNArioLista(tipoElemento elemento, posizione padre)//==NULL) da modificare accordingly **LEO**
{
_elemento=elemento;
_padre=padre;
cout<<endl<<endl<<endl<<this<<endl<<endl<<endl;
}
template<class T>
NodoAlberoNArioLista<T>::NodoAlberoNArioLista(NodoAlberoNArioLista<T>& nodo)
{
_elemento=nodo._elemento;
}
template<class T>
NodoAlberoNArioLista<T>& NodoAlberoNArioLista<T>::operator=(NodoAlberoNArioLista<T>& nodo)
{
_elemento=nodo._elemento;
}
#endif
AlberoNArioAstratto.h
#ifndef _ALBERO_N_ARIO_ASTRATTO_H
#define _ALBERO_N_ARIO_ASTRATTO_H
#include <iostream>
#include<sstream>
#include <string>
using std::cout;
using std::istream;
using std::ostream;
using std::endl;
using std::string;
using std::istringstream;
template <class T, class P>
class AlberoNArioAstratto
{
public:
typedef T tipoElemento;
typedef P posizione;
virtual bool vuoto() const = 0;
virtual posizione radice() const = 0;
virtual void inserisciRadice(tipoElemento) = 0;
};
const string INIZIOFIGLITOKEN="[";
const string FINEFIGLITOKEN="]";
template <class T, class P>
istream &operator>>(istream &is, AlberoNArioAstratto<T,P>& alberoNArio)
{
typename AlberoNArioAstratto<T,P>::posizione tempPosizioneNodoAlbero;
string rigaElemento;
typename AlberoNArioAstratto<T,P>::tipoElemento tempElemento;
getline(is, rigaElemento);
istringstream iStringStream(rigaElemento);
iStringStream >> tempElemento;
alberoNArio.inserisciRadice(tempElemento);
tempPosizioneNodoAlbero=alberoNArio.radice();
getline(is, rigaElemento);
return is;
}
template <class T, class P>
ostream &operator<<(ostream &os, const AlberoNArioAstratto<T,P>& alberoNArio)
{
typename AlberoNArioAstratto<T,P>::posizione _tempRadice;
typename AlberoNArioAstratto<T,P>::posizione tempPosizioneNodoAlbero;
typename AlberoNArioAstratto<T,P>::tipoElemento tempElemento;
if (alberoNArio.vuoto()==true)
{return os;}
_tempRadice=alberoNArio.radice();
os<<tempElemento<<endl;
return os;
}
#endif
AlberoNArio.h
#ifndef _ALBERO_N_ARIO_LISTA_FIGLI_H
#define _ALBERO_N_ARIO_LISTA_FIGLI_H
#include "AlberoNArioAstratto.h"
#include "NodoAlberoNArioLista.h"
template <class T>
class AlberoNArio:public AlberoNArioAstratto<T, NodoAlberoNArioLista<T>* >
{
public:
typedef typename AlberoNArioAstratto<T, NodoAlberoNArioLista<T>* >::tipoElemento tipoElemento;
typedef typename AlberoNArioAstratto<T, NodoAlberoNArioLista<T>* >::posizione posizione;
AlberoNArio();
AlberoNArio(const AlberoNArio&);
~AlberoNArio();
void crea();
bool vuoto() const;
void inserisciRadice(tipoElemento);
posizione radice() const;
private:
static const posizione POSIZIONENULLA;
posizione _radice;
};
template <class T>
const typename AlberoNArio<T>::posizione AlberoNArio<T>::POSIZIONENULLA=NodoAlberoNArioLista<T>::POSIZIONENULLA;
//costruttori
template <class T>
AlberoNArio<T>::AlberoNArio()
{
crea();
}
template <class T>
AlberoNArio<T>::AlberoNArio(const AlberoNArio<T>& alberoNArio)
{
}
//distruttore
template <class T>
AlberoNArio<T>::~AlberoNArio()
{
}
template <class T>
void AlberoNArio<T>::crea()
{ _radice=POSIZIONENULLA; }
template <class T>
bool AlberoNArio<T>::vuoto() const
{ return (_radice==POSIZIONENULLA); }
template <class T>
void AlberoNArio<T>::inserisciRadice(tipoElemento elemento)
{
_radice==new NodoAlberoNArioLista<T>();//elemento,POSIZIONENULLA);
cout<<endl<<_radice<<endl;
}
template <class T>
typename AlberoNArio<T>::posizione AlberoNArio<T>::radice() const
{
return _radice;
}
#endif
メイン.cpp
#include <cstdlib>
#include <iostream>
#include "AlberoNArio.h"
#include <fstream>
using namespace std;
typedef AlberoNArio<int> AlberoGenealogico;
typedef AlberoGenealogico::posizione posizione;
int main(int argc, char *argv[])
{
AlberoGenealogico alberoGenealogico;
string fileAlberoGenealogico="Integers.txt";
ifstream filestreamAlberoGenealogico;
filestreamAlberoGenealogico.open(fileAlberoGenealogico.c_str(),ios::in);
if(!filestreamAlberoGenealogico)
{
cout << "Impossibile aprire il file "<<fileAlberoGenealogico<<"."; //<< argv[1] << " for reading.\n";
return (EXIT_FAILURE);
}
filestreamAlberoGenealogico>> alberoGenealogico;
cout<<endl<<alberoGenealogico<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
Interger.txt 1 2 2 3 4 5 56