10 Mar, 2010 14:07

Podemos usar C++ com Objective-C?

Para conseguir compilar código C++, o seu arquivo ".m" precisa ter a extensão ".mm". Mas atenção: os arquivos que tiverem tanto código C++ quanto Objective -C precisam também ter a extensão ".mm".

Observação: uma vez que seu código compile C++, código em C não é mais compilado. Para resolver esta questão, basta usar extern:

extern "C" {  #import "ImageUtils.h" }

Aqui vai um "Alo Mundo" que mistura tanto C++ quanto Objective-C como exemplo. Para testar, você pode colar o exemplo no main.mm.

#import <Foundation/Foundation.h> 

class AloMundo { 
    private: 
        id saudacao; 

    public: 
        AloMundo() { 
            saudacao = @"Alô, mundo!"; 
        } 

        AloMundo(const char* texto) { 
            saudacao = [[NSString alloc] initWithUTF8String:texto]; 
        } 

        void imprimir()  { 
            printf("%s\n", [saudacao UTF8String]); 
        } 
};

A classe AloMundo acima é em C++, porém se utiliza de código em Objective-C. Ela simplesmente tem a função de imprimir a saudação.

@interface Saudacao: NSObject { 
        AloMundo *aloMundo; 
}

- (id)init; 
- (void)dealloc; 
- (void)saudar; 
- (void)saudar:(AloMundo *)saudacao; 

@end 

@implementation Saudacao
- (id)init { 
    if (self = [super init])
        aloMundo = new AloMundo(); 

    return self; 
}

- (void)dealloc { 
    delete aloMundo; 
    [super dealloc]; 
} 

- (void)saudar { 
    aloMundo->imprimir(); 
} 

- (void)saudar:(AloMundo *)saudacao{ 
    saudacao->imprimir(); 
} 

@end

Já neste código acima, temos a classe Saudacao em Objective-C. Aqui também há código em C++, como podemos observar no init, que instancia a classe AloMundo.

int main() { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // Objective-C
    Saudacao *saudacao = [[Saudacao alloc] init]; 
    [saudacao saudar];                          // ------> Alô, mundo! 

    // C++
    AloMundo *aloMundo = new AloMundo("Hello, world!"); 
    [saudacao saudar:aloMundo];       // ------> Hello, world! 

    delete aloMundo; 
    [saudacao release]; 
    [pool release]; 

    return 0; 
}

No main, percebemos as duas formas de chamar o método de imprimir a saudação. Atenção para a forma de trabalhar com a memória. Em Objective-C, utilizamos alloc e release. Já em C++, new e delete.

Como mencionei acima, combinar as duas linguagens tem ressalvas, então tenha como premissas:

  • não é possível usar a sintaxe Objective-C para chamar um objeto C++;
  • não é possível adicionar construtores ou destrutores em Objective-C;
  • cuidado com as palavras reservadas de cada linguagem;
  • uma classe C++ não pode herdar de uma classe em Objective-C e vice-versa;
  • cada linguagem cuida de suas exceções, ou seja, uma exceção lançada em C++ não pode ser tratada em Objective-C e vice-versa.

Eu acredito que saber que podemos combinar as duas linguagens facilitará a vida de muitos desenvolvedores, pois já existem vários algoritmos prontos em C++ que são bastante úteis e não precisarão mais serem "traduzidos" para Objective-C.

Até mais!

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.