"private within this context"



  • Hallo erst mal,

    ich bekomme die ganze Zeit vom Compiler die obrige Fehlermeldung und weis einfach nicht warum.
    Hier mein Code:

    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    string *seqr = new string[100];
    
    class Analyzer{
    	//virtuelle Funktionen
    	virtual double compare(const string& seq1, const string& seq2) =0;
    	virtual const string& getName() const =0;
    
    	//protected 
    	protected:
    	long mTotalCom;
    	long mMatches;
    	string name;
    
    	public:
    	long getCom();
    	long getMatches();
    	};
    
    class IdentityAnalyzer : public Analyzer {
    
    	virtual double compare(const string& seq1, const string& seq2);
    	virtual const string& getName() const;
    	};
    
    long Analyzer::getCom(){
    	return mTotalCom;
    	}
    
    long Analyzer::getMatches(){
    	return mMatches;
    	}
    
    const string& IdentityAnalyzer::getName() const{
    	return name;
    	}
    
    double IdentityAnalyzer::compare(const string& seq1, const string& seq2){
    
    	mTotalCom++;
    
    	if(seq1 == seq2){
    		mMatches++;
    		return 1;	
    		}
    	}
    
    void einlesen(){
    	ifstream in;
    	in.open("sequences.txt", ifstream::in);	
    	string value;
    
    	for(int i=0; i<99; i++){
    		in >> value;
    		seqr[i] = value;
    		}
    
    	in.close();
    	}
    
    int main(){
    
    	einlesen();
    
    	IdentityAnalyzer* ari = new IdentityAnalyzer();
    
    	for(int k=0; k<99; k++){
    		for(int j=0; j<99; j++){
    			ari->compare(seqr[k], seqr[j]);
    			}
    		}
    
    	}
    

    Hier nochmal die genaue Fehlermeldung:

    seq.cpp: In function ‘int main()’:
    seq.cpp:46:8: error: ‘virtual double IdentityAnalyzer::compare(const string&, const string&)’ is private
     double IdentityAnalyzer::compare(const string& seq1, const string& seq2){
            ^
    seq.cpp:91:33: error: within this context
        ari->compare(seqr[k], seqr[j]);
    

    Was ich noch dazu sagen muss ist:
    -Die Klasse Analyzer ist so vorgegeben und darf nicht geändert werden

    Kann mir vllt jemand weiterhelfen? 😕



  • Die Funktion ist private, was gibt's daran nicht zu verstehen?



  • manni66 schrieb:

    Die Funktion ist private, was gibt's daran nicht zu verstehen?

    Es ist manchmal etwas hilfreicher, ein bisschen mehr Kontext in die Antwort zu packen, anstatt lediglich zu Fragen weshalb so eine (für erfahrene Programmierer triviale) Fehlermeldung denn nicht verstanden wird (so wie sie da steht kommt die Antwort ein wenig patzig rüber, und beantwortet wharscheinlich nicht einmal die eigentliche Frage :p).

    Ich kann mir vorstellen, dass man sich als C++-Anfänger vielleicht wundert, weshalb eine Methode private ist, obwohl sie nicht in einem private-Block steht. Die simple Antwort: Für Klassen (mit class deklariert) sind die Member immer private wenn sie in keinem Block mit anders lautender Zugriffkontrolle stehen ( public: oder protected: ). Das trifft für die beanstandete Methode zu.

    Bei struct s ist es übrigens genau anders herum: Hier sind die Member per Deafult public.

    Im Übrigen ist es vielleicht empfehlenswert, die public/protected/private-Blöcke nochmal gesondert einzurücken. Dann sieht man auf den ersten Blick, dass die beiden ersten Methoden nicht in einem solchen expliziten Zugriffs-Block stehen.

    Die schnellste Lösung deinen Code so wie er dort steht ans Laufen zu bekommen ist die beiden Methoden in IdentityAnalyzer public zu machen (auch wenn es vielleicht letztendlich nicht so gewollt ist, dieses Interface nach außen zu exponieren da die Methoden in der Basisklasse private sind. Das steht jedoch auf einem anderen Blatt...).

    Finnegan



  • Finnegan schrieb:

    manni66 schrieb:

    Die Funktion ist private, was gibt's daran nicht zu verstehen?

    Es ist manchmal etwas hilfreicher, ein bisschen mehr Kontext in die Antwort zu packen, anstatt lediglich zu Fragen weshalb so eine (für erfahrene Programmierer triviale) Fehlermeldung denn nicht verstanden wird (so wie sie da steht kommt die Antwort ein wenig patzig rüber, und beantwortet wharscheinlich nicht einmal die eigentliche Frage :p).

    Ich kann mir vorstellen, dass man sich als C++-Anfänger vielleicht wundert, weshalb eine Methode private ist, obwohl sie nicht in einem private-Block steht. Die simple Antwort: Für Klassen (mit class deklariert) sind die Member immer private wenn sie in keinem Block mit anders lautender Zugriffkontrolle stehen ( public: oder protected: ). Das trifft für die beanstandete Methode zu.

    Bei struct s ist es übrigens genau anders herum: Hier sind die Member per Deafult public.

    Im Übrigen ist es vielleicht empfehlenswert, die public/protected/private-Blöcke nochmal gesondert einzurücken. Dann sieht man auf den ersten Blick, dass die beiden ersten Methoden nicht in einem solchen expliziten Zugriffs-Block stehen.

    Die schnellste Lösung deinen Code so wie er dort steht ans Laufen zu bekommen ist die beiden Methoden in IdentityAnalyzer public zu machen (auch wenn es vielleicht letztendlich nicht so gewollt ist, dieses Interface nach außen zu exponieren da die Methoden in der Basisklasse private sind. Das steht jedoch auf einem anderen Blatt...).

    Finnegan

    Vielen daank!
    Genau das wollte ich wissen 👍


Anmelden zum Antworten