Frage zu den "Großen Drei"



  • Die grossen Drei brauchst du hauptsächlich, wenn du tiefe Kopien erstellst. Also eben mit Zeigern und dynamischer Speicherverwaltung. Wenn du alles Objekte hast, reichen die compilergenerierten Kopierkonstruktoren, Destruktoren und Zuweisungsoperatoren.

    Wenn man Zeiger mit eigener Speicherverwaltung in der Klasse hat, aber die Klasse gar nie kopieren/zuweisen muss, macht man die entsprechenden Methoden am besten gleich private .

    Mit Referenzen oder konstanten Membern muss man aber aufpassen, da diese nicht zugewiesen werden können. Es kann also kein Default-Zuweisungsoperator erstellt werden (was meistens mit einer Warnung mitgeteilt wird).



  • @Firefighter: Das ist mir zu allgemein, das hilft mir leider nicht 😞

    @Nexus: Danke! Das mit den konstanten Membern ist ein guter Hinweis.
    Eigentlich geht es mir nämlich um den VC Compilefehler C2248

    C2248: "PointGeneration::propagateTrue3DPoints": Kein Zugriff auf private Member, dessen Deklaration in der PointGeneration-Klasse erfolgte.

    Meine bisherigen Recherchen haben ergeben, dass es da bei mir vermutlich aufgrund von Compiler-generiertem Code nicht klappt. Daher die Frage nach den Großen Drei.

    Mal schauen, ob der Fehler mit den const-Membern zu tun hat.
    Falls ja: Kann ich überhaupt Copy-Ctor und operator= haben, wenn manche Member const sind?



  • Du greifst da schlichtweg auf eine Member zu, die Privat ist. Mach sie öffentlich und dann geht es.



  • richtigplusplus schrieb:

    C2248: "PointGeneration::propagateTrue3DPoints": Kein Zugriff auf private Member, dessen Deklaration in der PointGeneration-Klasse erfolgte.

    Meine bisherigen Recherchen haben ergeben, dass es da bei mir vermutlich aufgrund von Compiler-generiertem Code nicht klappt. Daher die Frage nach den Großen Drei.

    Mal schauen, ob der Fehler mit den const-Membern zu tun hat.

    Fehlermeldungen haben nicht umsonst einen Text, der die Art des Fehlers beschreibt. Würdest du diesen lesen, dann wüsstest du, dass es nicht am const liegt...
    @ drakon: Er soll lernen, die Fehlermeldungen zu lesen 😉

    richtigplusplus schrieb:

    Kann ich überhaupt Copy-Ctor und operator= haben, wenn manche Member const sind?

    Kopierkonstruktor schon, da ja da neue Elemente erzeugt und initialisiert werden. Initialisierung von konstanten Variablen und Referenzen ist erlaubt, Zuweisung hingegen nicht.



  • Aber sollte eine Funktion aus PointGeneration, die von einer PointGeneration-Instanz aufgerufen wird nicht sowieso Zugriff auf private Member haben?
    Es tritt auch nur bei dieser einen Funktion auf, andere Funktionen aus PointGeneration geben mir diese Meldung nicht.

    Außerdem hab ich das schon mal versucht, die betroffene Variable public zu machen, aber das hat nix geholfen. Auch wenn die Funktion eine leere Implementierung hat, bekomme ich den Fehler. Es muss also schon mit damit schiefgehen

    void PointGeneration::propagateTrue3DPoints(ParameterManager const & pmg, NEWMAT::ColumnVector move)
    

    Die Klasse Parametermanager habe ich selbst erstellt.



  • Also ihr seid echt schneller als ich hier antworten kann 👍

    @Nexus: Du hast recht, ich verstehe die Fehlermeldung nicht, würde das gern tun. Im Netz hab ich dazu hauptsächlich Dinge mit friend und mit vererbten Klassen gefunden, aber beides verwende ich nicht.

    Da Du die Fehlermeldung anscheinend verstehst, wäre ich ganz froh, wenn Du mir sagen könntest, was da schiefläuft. 😕



  • Poste noch ein wenig mehr Code (d.h. die relevanten Klassenmember und die zugreifenden Funktionen)... Also alles, was direkt mit dem Fehler zusammenhängt.



  • void PointGeneration::propagateTrue3DPoints(ParameterManager const & pmg, NEWMAT::ColumnVector move) /*Vorbed: Projektionsmatrizen und bestückte fullPointTruth-Liste */
    {
    	NEWMAT::Matrix invtransformation(4,4);
    	invtransformation = createHomInvTransfMatrix(move(4), move(5), move(6), move(1), move(2), move(3));	
    	NEWMAT::ColumnVector point3D(4);
    	std::vector< std::pair<int, NEWMAT::ColumnVector > >::iterator listiter;
    	for (listiter = true3Dpoints.begin(); listiter != true3Dpoints.end(); ++listiter)
    	{
    		//Modify 3D point
    		point3D = listiter->second;
    		point3D = invtransformation*point3D;
    		if(!isPointInViewField(pmg, point3D))
    		{
    			point3D = createRandom3DPointInViewField(pmg);
    		}
    		listiter->second = point3D;
    	}
    }
    

    Das ist die Funktion propagateTrue3DPoints. Der Fehler tritt aber auch auf, wenn die Implementierung leer ist.

    NEWRAN::Uniform myUniRNG;
    	NEWRAN::Normal myNormRNG;
    	double myseed;
    
    	int nbofpoints;
    
    	double sideBound;
    	double zlBound;
    	double zuBound;
    
    	NEWMAT::Matrix projMR;
    	NEWMAT::Matrix projML;
    	NEWMAT::Matrix projMRp1;
    
    	NEWMAT::ColumnVector TrifocalPointList;
    	NEWMAT::ColumnVector EpipolarPointList;
    
    	int disturbtype;
    	double disturbamount;
    
    	std::vector< std::pair<int, NEWMAT::ColumnVector > > true3Dpoints;
    	//hier kommen noch weitere std::vector< >, die aber mit der Funktion nix zu tun haben
    

    Hatte vergessen, dass auch noch Member vom Typ NEWRAN da sind, glaube aber nicht, dass es daran liegt. (NEWRAN ist ein Zufallszahlengenerator von dem Autor von NEWMAT.)

    Die Funktionen isPointInViewField und createRandom3DPointInViewField sind auch private. Sollte es daran liegen?



  • AARGHH. Die Funktion propagateTrue3Dpoints ist selber private.

    Mir war von der Sprechweise der Fehlermeldung nicht klar, dass mit Member auch Funktionen gemeint sein können. Hab immer nur an Variablen gedacht.

    Dann mal vielen Dank für die Hilfe zur Selbsthilfe!



  • richtigplusplus schrieb:

    Dann mal vielen Dank für die Hilfe zur Selbsthilfe!

    Kein Problem 😉

    Aber glaub mir, es hilft enorm, die Fehlermeldungen zu lesen 🙂



  • Ich hab die Fehlermeldung zig mal gelesen. Aber da mir nicht klar war, dass Member auch Memberfunktion heißen kann, hab ich nur nach Variablen gekuckt.
    Bin halt noch nicht soo lange am C++en. Will es aber lieber richtig machen anstatt was hinzupfuschen.


Anmelden zum Antworten