2010-12-24 7 views
2

Ich versuche zu verstehen, wie explizite Konstruktor Aufruf im Haupt funktioniert mit dem folgenden Code.explizite Verwendung von Konstruktor Aufruf in main als Funktionsaufruf Parameter

#include<iostream> 

using namespace std; 

class Dependency1 
{ 
     bool init; 
public: 
    Dependency1() : init(true) { 
    std::cout << "Dependency1 construction" 
       << std::endl; 
    } 
    void print() const { 
    std::cout << "Dependency1 init: " 
       << init << std::endl; 
    } 



}; 


class Dependency2 { 
    Dependency1 d1; 
public: 
    Dependency2(const Dependency1& dep1): d1(dep1){ 
    std::cout << "Dependency2 construction "; 
    print(); 
    } 
    void print() const { d1.print(); } 
}; 

void test(const Dependency1& dd1) 
{ 
    cout << " inside Test \n"; 
    dd1.print(); 
} 



int main() 
{ 

    test(Dependency1()); 
    Dependency2 D1(Dependency1()); // this line does not work 

    return 0; 
} 

Funktion Test aufgerufen wird, wo Konstruktor abhaengigkeit1() als Funktionsaufruf statt verwendet wird abhaengigkeit1 :: abhaengigkeit1() und der Code ausgeführt wird völlig in Ordnung.

Wenn ich jetzt ein ähnliches Konzept verwende, um ein Objekt D1 von Dependency2 zu erstellen, funktioniert es nicht. Scheint, dass ich hier etwas falsch mache, basierend auf falschem Verständnis.

müssen wissen, wie der Compiler auch in Haupt abhaengigkeit1() Aufruf löst, wenn Umfang Auflösung nicht verwendet wird und warum es nicht funktioniert, wenn ich es als Parameter in Konstruktor Dependency2

Danke, verwenden Anand

Antwort

1

Dependency1() erstellt ein temporäres Objekt vom Typ Dependency1, das an Funktionstest übergeben wird.

+0

+1 Einfach kurz und verständlich. –

+0

danke, aber warum es nicht funktioniert, wenn ich ähnliche Sache verwenden, um Dependency2-Objekt zu erstellen. – Anand

+0

@Anand: Überprüfen Sie meine Antwort. –

7

test(Dependency1())

Dies ruft eine Funktion test und leitet ein temporäres Objekt der Klasse Dependency1. Da der Formalparameter in der Definition test eine Referenz auf const ist und weil Provisorien an const gebunden werden können, funktioniert Ihr Code.

Dependency2 D1(Dependency1()); // this line does not work

Dies ist C++ drängendsten Parsing bezeichnet. D1 wird als eine Funktion interpretiert, die Dependency2 zurückgibt und ein Argument einen Zeiger auf Funktion nimmt, die Dependency1 zurückgibt.

Versuchen Sie und sehen Sie die Änderung der Ausgabe.

Hinweis: Durch Einfügen eines zusätzlichen Klammerpaars würde der Compiler (Dependency1()) als Ausdruck behandeln.

+0

Mehr auf den Punkt als meins. – Oswald

+0

Das ist großartig. Vielen Dank. Gibt es eine andere Möglichkeit, den Compiler dazu zu bringen, D1 als Objekt und nicht als Funktion zu erkennen? – Anand

+0

@Prasoon: +1 für diese perfekte Antwort. good job :-) – Nawaz