我有一个xcode项目,它有两个类- Stem和Player,我试图从面向对象的角度确保我的代码是可靠的,我相信这是可以接受的编程实践,我的Player类访问我的Stem类中的信息。
我想从stem中的一个数组访问索引--我可以从我的视图控制器中使用
stem.index[i]当我试图在player中这样做时,我不被允许,因为stem是未声明的。我试着将Stem.h导入到我的Player.m文件中,并在player中声明了stem (类似于在视图控制器中这样做),但是得到了错误(在‘Stem’之前应该是说明符-限定符-列表)。
这样做的正确方法是什么?请原谅我对术语的随意使用,因为我对此相对较新。提前感谢:)
编辑
下面是一些代码,我在viewController中声明了stem & player
#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import "Stem.h"
#import "Player.h"
@interface TestApp_v1ViewController : UIViewController {
Stem *stem;
Player *player;我在viewController.m中分配和初始化了我的两个对象stem和player
- (void)viewDidLoad {
     [super viewDidLoad];
 NSLog(@"Init Successful");
 [self loadMOV];
 [self setupInterface];
 stem = [[Stem alloc] init];
 player = [[Player alloc] init]; 
}然后我移动到Stem.h,在那里我再次声明了stem.h (这样,当stem.h导入player.h时,播放器就可以访问stem.h了--根据glogic的注释)
#import <Foundation/Foundation.h>
@interface Stem : NSObject {
int *index;
int numberOfStems;
Stem *stem;
}
@property(nonatomic,readwrite) int *index;
@property(nonatomic, retain) Stem *stem;Player.h看起来像这样:
//  Player.h
#import <Foundation/Foundation.h>
#import "Stem.h"
@interface Player : NSObject {
NSMutableArray *player1;
}
@property(nonatomic,retain) NSMutableArray *player1;
-(void) playAudio;
@end最后,在Player.m中,我尝试访问索引数组
#import "Player.h"
@implementation Player
@synthesize player1;
-(void)playAudio {
NSLog(@"play audio called");
NSLog(@"index[0] is: %i", stem.index[0]);
}
@end我仍然被告知stem是未声明的,有什么想法吗?
编辑#2 -添加基本程序
我希望这被认为是可以的,但我已经决定发布我的程序(减少到最基本的部分)。我认为这可能是解决这个问题的唯一方法--因为很多事情都是跨类进行的。我已经试了好几个小时了……
我在viewController中分配并初始化了我的stem和player对象-我认为这是最好的方法,但也许还有更好的方法。
//Part (i)
//  TestApp_v1ViewController.h
#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import "Stem.h"
#import "Player.h"
@interface TestApp_v1ViewController : UIViewController {
Stem *stem;
Player *player;
}
@property(nonatomic, retain) Stem *stem;
@property(nonatomic, retain) Player *player;
@end
//Part (ii)
//  TestApp_v1ViewController.m
#import "TestApp_v1ViewController.h"
#import <MediaPlayer/MediaPlayer.h>
@implementation TestApp_v1ViewController
@synthesize stem;
@synthesize player;
 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
 - (void)viewDidLoad {
 [super viewDidLoad];
 NSLog(@"Init Successful");
 stem = [[Stem alloc] init];
 [stem loadURLs];
 player = [[Player alloc] init];
 [player playAudio];
 int index = stem.value;
 NSLog(@"r is: %i", index);   //checking to see if I can get a value from the index array - this works fine, so 'value' can be accessed from the viewController
}这里我声明了一个int数组&稍后我想要从我的播放器访问的int "value“(这就是问题所在)
//Part (iii)
//  Stem.h
#import <Foundation/Foundation.h>
@interface Stem : NSObject {
NSMutableArray *urlArray;
int *index;
int value;
int numberOfStems;
Stem *stem;
}
- (void)loadURLs;
- (void)randomiseAudioForInitialPlay;
@property(nonatomic,retain) NSMutableArray *urlArray;
@property(nonatomic,readwrite) int *index;
@property(nonatomic,readwrite) int numberOfStems;
@property(nonatomic,readwrite) int value;
@property(nonatomic, retain) Stem *stem;
@end
//Part (iv)
//  Stem.m
#include <stdio.h>
#import "Stem.h"
@implementation Stem
@synthesize numberOfStems;
@synthesize urlArray;
@synthesize index;
@synthesize stem;
@synthesize value;
- (void)loadURLs
{
NSLog(@"Loading URLs");
numberOfStems = 20;
urlArray = [[NSMutableArray alloc] init];
for ( int i = 1; i <= numberOfStems; i++ ) {
    NSString *soundName = [NSString stringWithFormat:@"stem-%i", i];
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath];
    [urlArray addObject:soundFile];
    [soundFile release];
}
[self randomiseAudioForInitialPlay];
}
- (void)randomiseAudioForInitialPlay 
{
index = malloc(numberOfStems*sizeof(int));
for (int i = 0; i < numberOfStems; i++)
{
    index[i] = i;
}
for (int i = (numberOfStems - 1); i > 0; i--)
{
    int randomIndex = arc4random() % i;
    int tmp = index[i];
    index[i] = index[randomIndex];   
    index[randomIndex] = tmp;
}
value = self.index[10];        //this is what needs to be accessed later, from player
NSLog(@"value at index 10 is:%i", value);
}
@end我在这里包含了'Stem.h‘,因为播放器需要词干才能返回stem.value
//Part (v)
//  Player.h
#import <Foundation/Foundation.h>
#import "Stem.h"
@interface Player : NSObject {
Player *player;
}
@property(nonatomic, retain) Stem *stem;
@property(nonatomic, retain) Player *player;
-(void) playAudio;
@end这就是问题所在,我的NSLog语句告诉我这个值是0,尽管我可以看到它(例如)在词干中是14。编译器也不会给出错误。
//Part (vi)
//  Player.m
#import "Player.h"
@implementation Player
@synthesize player;
@synthesize stem;
-(void)playAudio {
int value = stem.value;
NSLog(@"value is:%i", value );
}
@end这是我第一次尝试面向对象的项目,所以我在工作中学习,有什么建议可以解释为什么我不能在Player类中访问stem.value?
我对这样一个程序中的各种对象如何相互交互(以及正确的语法)的想法仍然模糊不清,所以请原谅我在代码中出现疯狂的n00b错误:)
发布于 2012-01-30 22:52:09
你在播放器中的什么地方声明了stem?如果您在player.h中声明它,那么您将需要在player.h中导入stem.h,而不是player.m。
编辑:是的,它仍然是未声明的,因为你在视图控制器而不是播放器中声明了stem。嗯,这里似乎有一些不对劲的地方。这实际上取决于您的代码将如何实际工作
#import Stem.h
@interface Player : NSObject {
NSMutableArray *player1;
}
@property(nonatomic,retain) NSMutableArray *player1;
@property(nonatomic,retain) Stem *stem;
-(void) playAudio;
@endimport "Player.h"
@implementation Player
@synthesize player1, stem = _stem;
-(void)playAudio {
NSLog(@"play audio called");
NSLog(@"index[0] is: %i", _stem.index[0]);//stem.index[0] will be a problem here as its not a c array
}
@end然后在你的控制器中
player.stem = stem;我不确定为什么要在stem类中创建一个词干指针。
@interface Stem : NSObject {
int *index;
int numberOfStems;
}
@property(nonatomic,readwrite) int *index;如果你想要一个词干数组,那么在控制器中创建它
编辑:在你有了行之后
player = [[Player alloc] init];
 [player playAudio];添加
player.stem = stem;您必须将播放器中的指针分配给在视图控制器中创建的词干。
发布于 2012-01-30 22:52:23
最好的方法是在Stem类中创建一个方法,如下所示:
value =词干valueAtIndex:i;
这样就减少了耦合,并且在Stem类中保存值的方式不会公开,如果需要,可以在以后进行更改,而无需宣传访问调用。
https://stackoverflow.com/questions/9065508
复制相似问题