Variable als Objektname



  • "das problem" kann so nicht gelöst werden. die frage ist nämlich: kann man eine variable mit einem variablen namen deklarieren? die antwort lautet: nein.
    wenn du einen variablennamen zusätzlich brauchst, kannst du den in einem string abspeichern und das ganze als std::pair in einem std::vector unterbringen (oder gleich in einer std::map ). dass die intern mit new arbeiten ist ein implementationsdetail. wenn du keinen zusätzlichen variablennamen brauchst, kannst du auch mit new[] arbeiten, klar. sagt ja niemand, dass dein vorschlag keine lösung für das problem ist 😉



  • Wie willst du sonst eine variable Menge von Objekten erstellen, wenn nicht mit new?

    #include <string>
    #include <vector>
    #include <iostream>
    
    int _main(int argc, _TCHAR* argv[])
    {
    
    	std::vector<std::string> v;
    	for (int i = 0; i <10; ++i)
    	{
    		std::string s = "Das ist ein Objekt auf dem Stack";
    		v.push_back(s);
    	}
    
    	for(std::vector<std::string>::const_iterator it = v.begin();
    		it != v.end();
    		++it)
    	{
    		std::cout << *it << std::endl;
    	}
    
    	return 0;
    }
    


  • Ich gehe mal einfach davon aus, dass du eine Reihe von Ecken (oder Vertices) hast, du diese anlegen bzw. verarbeiten willst. Dein "Problem" ist, dass die Variablennamen im übersetzten Programm nicht mehr bekannt sind.

    Du könntest das ganz einfach über ein Array lösen (ungetestet):

    const size_t anzahl = 10000;
    Vertex* vertices = new Vertex[anzahl];
    
    for(size_t i = 0; i < anzahl; ++i) {
        vertices[i] = Vertex(0.0f, 0.0f, 0.0f);
    }
    
    delete[] vertices;
    

    Grüße... Heiko



  • simon.gysi schrieb:

    Wie willst du sonst eine variable Menge von Objekten erstellen, wenn nicht mit new?

    #include <string>
    #include <vector>
    #include <iostream>
    
    int _main(int argc, _TCHAR* argv[])
    {
    
    	std::vector<std::string> v;
    	for (int i = 0; i <10; ++i)
    	{
    		std::string s = "Das ist ein Objekt auf dem Stack";
    		v.push_back(s);
    	}
    
    	for(std::vector<std::string>::const_iterator it = v.begin();
    		it != v.end();
    		++it)
    	{
    		std::cout << *it << std::endl;
    	}
    
    	return 0;
    }
    

    Sorry, habe schon einen Schritt zu weit gedacht. 😉



  • bwbg lag da schon ganz nah dran.
    allerdings ist es mir noch nicht ganz klar was denn da genau passiert

    bwbg schrieb:

    const size_t anzahl = 10000;
    Vertex* vertices = new Vertex[anzahl];
    
    for(size_t i = 0; i < anzahl; ++i) {
        vertices[i] = Vertex(0.0f, 0.0f, 0.0f /* Sollen das Koordinaten sein ?? oder habe ich da was vergessen ...*/); 
    }
    
    delete[] vertices;  // kann ich auch schreiben delete vertices [objektnr.] ??
    

    Also ich habe ein Objekt Vertex (bei mir ecke) und in diesem erstelle als Array anzahl an Objekten der klasse vertex.
    Die Objekte kann ich dann jeweils per vertices[objektnr] ansprechen
    Richtig??

    Zuer erklärung was ich mache, es handelt sich um Graphen. Bei denen ist die Koordinate zumindest in meinem falle egal. es geht nur um die Verbindungen zwischen den ekcen (diese werden später als eigenschaften angegeben)
    Durch einen bestimmten algorithmus wird dann herausgefunden, ob z.B. eine Euler Tour (alle Kanten entlang "laufen" und am ausgangspunkt ankommen)oder ein Eulerscher Kantenzug möglich ist und deren variationen



  • Vertex dient hier lediglich der Illustration. Die Klasse könnte genauso gut Apfel, Kartoffelsalat oder Koordinate heißen.

    Der Aufruf Vertex(0.0f, 0.0f, 0.0f) ist in diesem Fall der Konstruktoraufruf.

    Mittels dem Indexoperator [] kannst du auf die Elemente des Arrays zugreifen. Du musst allerdings selbst dafür sorgen, dass der Bereich nicht überschritten wird (Segmentation-Faults wären noch die angenehmste Folge einer Überschreitung).

    Wichtig zu wissen ist, dass new lediglich Speicher anfordert. Mit delete gibst du den (mit new) angeforderten Speicher wieder frei (was man immer tun MUSS).

    Wenn du mehr Flexibilität benötigst, solltest du dir die oben schon angesprochenen Standardcontainer-Klassen (std::vector, std::list, etc.) mal ansehen - diese nehmen dir auch die Speicherverwaltung ab.

    Grüße...



  • hmm
    danke, dass habe ich mir schon so gedacht.
    Ich habe in der zwischen Zeit mal meine Funktion zu erstellung der Ecken erstellt
    wäre einer so freundlich mal kurz drüber zu lesen??
    Ich glaube, dass ich es so machen kann. Getestet habe ich noch nicht.

    void neueecken()
    	{
    	cout << "Beginnen wir mit der Erfassung der Ecken." << endl
    	<< "Sie können später alle Ecken nachbearbeiten."<< endl
    	<< "merken sie sich dafür einfach die Nr. der Ecke." << endl
    	<< "Diese wird vom Programm jeweils bekannt gegeben." << endl;
    	cout << "Wie viele Ecken möchten sie erstellen?";
    	size_t anzahl;
    	cin >> anzahl;	cout << anzahl << endl;
    	ecke* vertices = new ecke[anzahl];
    
    	for (i=0,i>=int(anzahl),i++)
    		{
    		cout << "Beginnen wir mit der" << i << ".-Ecke." << endl;
    		cout << "Wie viele Verbindungen (Kanten) besitzt die Ecke?";
    		cin >> vertices[i].grad; cout << vertices[i].grad << endl;
    			for (b=0, b>= vertices[i].grad, b++)
    			{
    			cout << "Mit welchen weiteren Eckennummer soll die aktuelle Ecke verbunden werden?";
    			int eckennr
    			cin >> eckennr
    			vertices[i].verbindung.push_back(eckennr); cout <<  vertices[i].verbindung[b] << endl;
    			}
    		cout << endl << endl << endl;
    		}
    	}
    

    😮 😮

    Vielen dank schon mal im Voraus



  • Also da wird kaum was rauskommen.

    Überleg dir das:

    for (i=0,i>=int(anzahl),i++)
    

    mal noch genau.Und vor allem, was was genau macht.

    Und warum hast du das den noch nicht selber getestet?? 🙄

    EDIT:

    Dasselbe gilt für die 2. for-Schlaufe.



  • ich habs dir ma versucht bissl zu erklären...

    for (i=0,i>=int(anzahl),i++)
          1        2         3
    

    1.: size_t i (0) bzw. size_t i = 0 (wobei ich die Initialisierung mit Klammern besser find 😛 ) (sonst würde dir der compiler sagen, dass er 'i' nicht kennt... da i dann auch von size_t ist, entfällt der doofe (c-style-)cast (solltest du dir auch abgewöhnen)
    2.: hier kommt nicht hin, wann er aufhören soll, sondern wann er weitermachen soll (verzeiht mir diesen Satz ^^) mit >= würde niemals (außer, wenn man 0 ecken eingegeben hat, dann 1 ^^) auch nur 1 Schleifendurchlauf zu Stande kommen -> i < anzahl - sollte nicht all zu unlogisch sein ^^ (nicht <=, weil ja die 0 mit dabei ist ^^)
    3.: ++i - man zieht preincrement vor - das macht hier noch nichts aus, aber wird spätestens bei iteratoren schneller sein...

    soo... ok? 🤡



  • Nachdem ich als erstes überhaupt keinen Durchblick hatte, habe ich ihn nun doch gefunden.

    Danke aber für die große hilfe bis hierher 🙂

    Falls fragen aufkommen, oder noch anmerkungen zum quellcode oben sind, wird man mich hier finden.


Anmelden zum Antworten