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!