2016-04-05 8 views
1

Ich verwende eine C++ - Header nur Klasse in iOS-Entwicklung (Xcode).Header-Implementierung Variable Neudefinition zeigt keinen Fehler

In A.hpp

class A { 
    public: 

     A() { 
      B b; 
     } 

     void run() { 
      b.run(); 
     } 

    private: 

     B b; 
} 

B in einer wissenschaftlichen Rechen Bibliothek definiert ist, und b.run() wird voraussichtlich spürbar Zeit in Anspruch nehmen.

In ViewController.mm (oder als main.cpp betrachten)

A* a = new A(); a->run(); 

gut funktioniert (normalerweise würde ich einige Fehler für variable Neudefinition erwarten, hier b zweimal definiert), aber braucht mehr als zweimal Zeit als erwartet.

Nach dem Entfernen B b; in A() funktioniert alles so, wie es sein sollte.

Ich frage mich, ob der Grund für diese seltsame Sache verursacht durch Aufruf von b.run() zweimal und Compiler tatsächlich behandeln zwei Definitionen als separate Initialisierung und Anruf auf ihnen separat ausgeführt werden. Aber warum hat der Compiler keinen so schwerwiegenden Fehler gefunden?

+0

Sie sollten überprüfen, wie viel Zeit es dauert, um Objekt der Klasse B zu initialisieren. : run() Methode' – HadeS

+0

Dort gibt es übrigens keine Neudefinition. Diese zwei Variablen sind in verschiedenen Bereichen. – Glapa

+0

Es ist ein schlechter Stil, aber Sie können eine lokale Variable haben, die denselben Namen wie eine Klassenmitgliedsvariable hat - sie sind verschieden, und die lokale Variable ist diejenige, die in der Funktion verwendet wird. Wenn Sie erwarten, dass der Konstruktor für 'A' die Membervariable' b' initialisiert, müssen Sie erneut nachdenken. Es ist spät hier, aber würde 'A(): b() {}' die Arbeit machen, nach der Sie suchen? –

Antwort

4

Es ist zulässig, eine lokale Variable mit demselben Namen wie eine Elementvariable zu definieren. Dadurch wird einfach die Membervariable in diesem Bereich ausgeblendet (Sie können immer noch darauf zugreifen -> b).

0

Zuerst gibt keine Variable Neudefinition im Code ist, weil die Deklaration in A() lokalen Bereich hat und mit der Erklärung von ‚b‘ als Klasse Mitglied (er verbirgt widerspricht nicht nur die Elementvariable mit in dieser Umfang). Zweitens kann ich aus den gegebenen Informationen nicht entnehmen, warum dies doppelt so lange dauert, es sei denn, der Konstruktor der Klasse B ruft seine Methode run() auf oder tut etwas Zeitaufwendiges. Sie sollten den Konstruktor der Klasse B überprüfen und was er darin macht.

Verwandte Themen