2012-03-26 24 views
0

Ich frage mich, wie Sie eine Getter-Funktion von einer anderen Klasse in einer anderen Klasse aufrufen würden. Zum Beispiel, was haben wird ich jetzt nicht funktioniertGetter von einer anderen Klasse in einer Klasse aufrufen

class A{ 
public: 
    friend class B; 
std::string getfirst(){ return b.getfirst();} 
private: 
    B b; 
}; 

class B{ 
public: 
    std::string getfirst(){ 
     return first_; 

    } 
private: 
    std::string first_; 

}; 

Wie würde ich dieses Problem beheben, so dass ich B GetFirst Funktion aufrufen kann?

+2

Dieser Code wird nicht einmal leicht kompilieren ... Sie haben 'std :: string getfirst() {std :: string getfirst() {'. –

+0

Ich mochte den "leicht kompilieren" -Teil ;-) –

Antwort

2

Sie brauchen keine Freundschaft.

Worüber?

class B { 
public: 
    std::string get_first() const { return first_; } 
private: 
    std::string first_; 
}; 

class A { 
public: 
    std::string get_first() const { return b.get_first(); } 
private: 
    B b; 
}; 

Nun, Klasse B einen Getter für das erste und Klasse A hat Getter, die Delegierten Elementvariable b.

+0

Ich versuchte das und es gibt mir einen Kompilierfehler, der besagt, dass B kein getfirst Mitglied hat – user798774

+0

Überprüfen Sie die Eingabe. In meinem Beispiel habe ich den Getter als get_first() anstelle von getfirst() benannt. –

0
class B{ 
    public: 
     std::string getfirst(){ 
      return first_; 
     } 
    private: 
     std::string first_; 
    }; 

    class A : public B{ 
     public: 
     //class A has derived the "getfirst" from B 
     private: 
     // add your stuff here 
    }; 

hat es nicht kompilieren, sollte aber funktionieren

0

Der Code, den Sie haben einen Fehler hat: std::string getfirst(){ in B zweimal wiederholt wird, wird dies ein Übersetzungsfehler verursachen.

Auch brauchen Sie nicht B als Freund von A zu erklären, wie B ist nicht von A ‚s privaten Mitgliedern zuzugreifen versuchen. Ignorieren Sie dies, wenn Sie einen größeren Code haben, wo Sie die Freundschaftsdeklaration benötigen.

Sie müssen die Klasse B definieren, bevor Sie sie in A verwenden. Da B nicht auf A zugreifen, können Sie einfach die Definition vor A setzen.

0

Das ist wirklich wierd

std::string getfirst(){ 
     std::string getfirst(){ 
      return first_;  //cause compilation error 

Es wie korrigieren kann:

#include <iostream> 
using namespace std; 

class B; // Forward declaration of class B in order for example to compile 
class A 
{ 

public: 

    string getfirst(); 
    friend string :: getfirst(); // declaration of global friend 
}; 

class B 
{ 

public: 

    friend string :: getfirst(); // declaration of global friend 
    friend string A::getfirst(); // declaration of friend from other class 
}; 

ich Skelett gebe nur.

+0

es kompiliert für mich nicht, es sagt, dass Klasse B nicht das Mitglied getfirst hat – user798774

Verwandte Themen