klasseninstanz in vector



  • Das ist kein C++, ist also hier das falsche Forum.
    Sieht aber der Fehlermeldung nach zu urteilen schwer danach aus, als wäre ma nicht initialisiert.



  • ich meine worauf zeit ma ?
    wer erzeugt wo ein myapp?



  • vec_nodes.push_back(*mn);
    

    ja, genau an dieser stelle wird die exception geschmissen.



  • myapp *ma;
    

    zeile 65 in Form1.h. ma ist eine instanz von myapp.



  • Wenn du das ganze Projekt als zip hättest wäre das einfacher...



  • glasauge schrieb:

    zeile 65 in Form1.h. ma ist eine instanz von myapp.

    Nö, ma ist ein Zeiger auf myapp.
    Es sei denn, * hat in dieser Sprache eine völlig andere Bedeutung als in C++.



  • ma=new myapp();
    
    ma->addNode("test", index);
    

    gehts damit ?



  • ja, damit funktioniert es. jetzt bekomme ich aber eine exception bei SysToStd bzw StdToSys.



  • wo könnte man denn "ma = new myapp()" aufrufen, damit es bei formularaufruf instantiiert wird und nicht erst bei klick auf den button.



  • glasauge schrieb:

    wo könnte man denn "ma = new myapp()" aufrufen, damit es bei formularaufruf instantiiert wird und nicht erst bei klick auf den button.

    Im Konstruktor?



  • ok, ich hab es jetzt im konstrukto von Form1.h stehen.

    Jetzt wirft er mir diese Exception:

    System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
       bei myapp.SysToStd(myapp* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >* , String S) in c:\alg-projekte\ue02\ue02\myapp.cpp:Zeile 19.
       bei myapp.addNode(myapp* , String s, Int32 i) in c:\alg-projekte\ue02\ue02\myapp.cpp:Zeile 34.
       bei Ue02.Form1.button2_Click(Object sender, EventArgs e) in c:\alg-projekte\ue02\ue02\form1.h:Zeile 232.
    

    also im grunde genommen, der gleiche fehler.

    hier nochmal die veränderte myapp.cpp

    #include "StdAfx.h"
    #include "myapp.h"
    #include "mynode.h"
    
    myapp::myapp(void)
    {
    
    }
    
    myapp::~myapp(void)
    {
    }
    //System::String^ s
    
    std::string myapp::SysToStd(System::String^ S){
        std::string ss; 
        if (S->Length == 0) return ss;
    	System::IntPtr ip = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(S);
        try{
    		ss = static_cast<const char*>(ip.ToPointer());
        }__finally{
            System::Runtime::InteropServices::Marshal::FreeHGlobal(ip);
        }
        return ss;
    }
    
    System::String^ myapp::StdToSys(string str){
    	return gcnew System::String(str.c_str());
    }
    
    void myapp::addNode(System::String^ s, int i){
    	mynode *mn = new mynode(SysToStd(s),i);
    	vec_nodes.push_back(*mn);
    	delete mn;
    	}
    


  • hat niemand eine idee, woran es liegen könnte?



  • System.NullReferenceException frag doch mal asm-forum nach... oder du probierst einfach alle foren durch, bis du das richtige gefunden hast...
    oder du weist, was du dort machst und postest in nem .NET Unterforum... hört sich fast vernünftig an, oder?

    bb



  • glasauge schrieb:

    ok, ich hab es jetzt im konstrukto von Form1.h stehen.

    Wie wäre es wenn du dich mal mit dem C++/CLI Forum beschäftigst? Sofern (was mangels Headern nicht sichtbar ist) mynode als .Net Klasse deklariert wurde, musst du diese auch mit gcnew (und dem ^ statt 😉 verwenden. Meine C++/CLI-Kenntnisse sind aber nur maginal.

    Und C++/CLI gehört definitiv nicht in das C++ Forum, da es zwei verschiedene Sprachen sind, wobei erstere eine weitgehende Kompatibilität zu C++ hat, nicht aber umgekehrt.


Anmelden zum Antworten