1

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

4

1 に答える 1

4

_radice==new NodoAlberoNArioLista<T>();

する必要があります

_radice=new NodoAlberoNArioLista<T>();

于 2013-08-02T19:10:34.293 に答える