黑马程序员技术交流社区

标题: 关于组合的问题! [打印本页]

作者: LeeWong    时间: 2014-10-21 12:34
标题: 关于组合的问题!
本帖最后由 LeeWong 于 2014-10-21 18:03 编辑


  1. #import<Foundation/Foundation.h>

  2. @interface A : NSObject
  3. {
  4.     int _a;
  5.     int _b;
  6. }
  7. - (void)run;

  8. - (void)eat;

  9. @end

  10. @implementation A

  11. - (void)run
  12. {
  13.     NSLog(@"吃点东西");
  14. }

  15. - (void)eat
  16. {
  17.     NSLog(@"走两步");
  18. }

  19. @end

  20. @interface B : NSObject
  21. {
  22.     A *_c;
  23.     int _d;
  24. }
  25. @end

  26. int main()
  27. {
  28.     B *b = [B new];
  29.    
  30.     [b run];
  31.     [b eat];
  32. }
  33. /*
  34. 组合小测试.m:41:8: warning: 'B' may not respond to 'run'
  35.     [b run];
  36.      ~ ^
  37. 组合小测试.m:42:8: warning: 'B' may not respond to 'eat'
  38.     [b eat];
  39.      ~ ^
  40. 2 warnings generated.
  41. Undefined symbols for architecture x86_64:
  42.   "_OBJC_CLASS_$_B", referenced from:
  43.       objc-class-ref in 组合小测试-affcfe.o
  44. ld: symbol(s) not found for architecture x86_64
  45. clang: error: linker command failed with exit code 1 (use -v to see invocation)
  46. */

  47. 一个测试小程序 想知道组合的用法 但是编译链接时出现下面的问题   前面两个还可以理解 后面的不懂
  48. 这样子用 组合 对吗
复制代码



作者: 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的话,那么在主函数中就可以这样调用
  1. B *b = [B new];
  2.     A *a = [A new];
  3.     b->_c = a; // 让B类的_c指向新创建的A类对象,即实例化
  4.     [b->_c  run];
  5.     [b->_c  eat];
复制代码

用get方法的时候也是同理,另外,你的程序中没有写B类的@implementation,这样编译是不通过的。
这是我个人的一些理解~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2