2016-05-24 7 views
0

Ich versuche, auf diese Weise Gewohnheit C++ Klasse in einer Objective-C-Klasse zu integrieren:keine passende Konstruktor zur Initialisierung von - C++ und Objective C

C++ Klassenheader

class Analyzer 
{ 

public: 

    Analyzer(std::string const& face_cascade_url, std::string const& eyes_cascade_url, std::string const& nose_cascade_url); 

}; 

Objective C-Header:

@interface cvVideoWrapper : UIViewController <CvVideoCameraDelegate> 

@property Analyzer analyzer; 

@end 

Objective C Umsetzung:

@implementation cvVideoWrapper 


-(void) get_ready { 

    NSString* face_filename = [[NSBundle mainBundle] 
           pathForResource:@"haarcascade_frontalface_alt2" 
           ofType:@"xml"]; 
    NSString* eyes_filename = [[NSBundle mainBundle] 
           pathForResource:@"haarcascade_eye_tree_eyeglasses" 
           ofType:@"xml"]; 
    NSString* nose_filename = [[NSBundle mainBundle] 
           pathForResource:@"haarcascade_mcs_nose" 
           ofType:@"xml"]; 

    self.analyzer = Analyzer([face_filename UTF8String], [eyes_filename UTF8String], [nose_filename UTF8String]); 
} 

@end 
bei der Objective C Implementierung

Ich erhalte diese Fehlermeldung:

No matching constructor for initialization of 'Analyzer' 

Wie ich dieses Problem beheben?

Antwort

1

Ich würde vorschlagen, Forward-Deklaration hier zu verwenden, um Ihre Header zu bereinigen. Und verwende den Zeiger anstelle der Instanz.

Objective C-Header:

class Analyzer; 

@interface cvVideoWrapper : UIViewController <CvVideoCameraDelegate> 

@property Analyzer* analyzer; 
//    ^^ it is a pointer now 

@end 

Und dann in Objective C Umsetzung:

@implementation cvVideoWrapper 

-(void) get_ready { 

    NSString* face_filename = [[NSBundle mainBundle] 
           pathForResource:@"haarcascade_frontalface_alt2" 
           ofType:@"xml"]; 
    NSString* eyes_filename = [[NSBundle mainBundle] 
           pathForResource:@"haarcascade_eye_tree_eyeglasses" 
           ofType:@"xml"]; 
    NSString* nose_filename = [[NSBundle mainBundle] 
           pathForResource:@"haarcascade_mcs_nose" 
           ofType:@"xml"]; 

    // Create object here with new: 
    self.analyzer = new Analyzer([face_filename UTF8String], [eyes_filename UTF8String], [nose_filename UTF8String]); 
} 

// Don't forget to cleanup when you're done: 
- (void)dealloc 
{ 
    delete self.analyzer; 
    [super dealloc]; 
} 

@end 
0

Ich weiß nicht, wie ObjC mit C++ zu binden, aber es scheint mir, wie das Problem ist, dass Sie eine Analyzer nach Wert speichern, aber es hat keinen Standardkonstruktor. In C++ würde das bedeuten, dass Sie die Argumente für die Konstruktion in der Initialisierungsliste des Konstruktors für die enthaltene Klasse angeben müssen. Wenn das nicht möglich ist, müssen Sie nach Zeiger speichern.

Es sieht auch aus wie Analyzer hat keinen Zuweisungsoperator, so dass auch ein Problem wäre.

1

Angenommen, Sie haben die Kopfzeile von Analyzer eingeschlossen und lassen die Objective-C-Implementierung als Objective-C++ kompilieren. Konvertieren Sie den von UTF8String zurückgegebenen Wert in eine std::string. Der Compiler kann weder einen Konstruktor finden, der die richtige Signatur hat, noch die automatisch konvertierbaren Werte des Rückgabetyps UTF8String.

std::string([face_filename UTF8String]) usw. sollte funktionieren.

Verwandte Themen