黑马程序员技术交流社区
标题:
关于组合的问题!
[打印本页]
作者:
LeeWong
时间:
2014-10-21 12:34
标题:
关于组合的问题!
本帖最后由 LeeWong 于 2014-10-21 18:03 编辑
#import<Foundation/Foundation.h>
@interface A : NSObject
{
int _a;
int _b;
}
- (void)run;
- (void)eat;
@end
@implementation A
- (void)run
{
NSLog(@"吃点东西");
}
- (void)eat
{
NSLog(@"走两步");
}
@end
@interface B : NSObject
{
A *_c;
int _d;
}
@end
int main()
{
B *b = [B new];
[b run];
[b eat];
}
/*
组合小测试.m:41:8: warning: 'B' may not respond to 'run'
[b run];
~ ^
组合小测试.m:42:8: warning: 'B' may not respond to 'eat'
[b eat];
~ ^
2 warnings generated.
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_B", referenced from:
objc-class-ref in 组合小测试-affcfe.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
*/
一个测试小程序 想知道组合的用法 但是编译链接时出现下面的问题 前面两个还可以理解 后面的不懂
这样子用 组合 对吗
复制代码
作者:
LeeWong
时间:
2014-10-21 17:31
大家帮忙看一下 给解释一下被
作者:
Lizzie
时间:
2014-10-24 20:56
你这样写是不对的,因为在main函数中你只是创建了一个B类对象,B类对象的方法中并没有run和eat这两个方法,要想使用A类中的方法,必须先创建一个A类对象,并且把它赋值给B类的成员变量_c,但是你这里的_c是protected的,不能够直接访问,所以1.要么在B类的成员变量A *_c前面加上@public,2,要么为他提供get方法
如果是加@public的话,那么在主函数中就可以这样调用
B *b = [B new];
A *a = [A new];
b->_c = a; // 让B类的_c指向新创建的A类对象,即实例化
[b->_c run];
[b->_c eat];
复制代码
用get方法的时候也是同理,另外,你的程序中没有写B类的@implementation,这样编译是不通过的。
这是我个人的一些理解~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2