首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在程序中调用独立类中的类

在程序中调用独立类中的类
EN

Stack Overflow用户
提问于 2012-01-30 22:37:12
回答 2查看 152关注 0票数 1

我有一个xcode项目,它有两个类- Stem和Player,我试图从面向对象的角度确保我的代码是可靠的,我相信这是可以接受的编程实践,我的Player类访问我的Stem类中的信息。

我想从stem中的一个数组访问索引--我可以从我的视图控制器中使用

代码语言:javascript
运行
复制
stem.index[i]

当我试图在player中这样做时,我不被允许,因为stem是未声明的。我试着将Stem.h导入到我的Player.m文件中,并在player中声明了stem (类似于在视图控制器中这样做),但是得到了错误(在‘Stem’之前应该是说明符-限定符-列表)。

这样做的正确方法是什么?请原谅我对术语的随意使用,因为我对此相对较新。提前感谢:)

编辑

下面是一些代码,我在viewController中声明了stem & player

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
- (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的注释)

代码语言:javascript
运行
复制
#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看起来像这样:

代码语言:javascript
运行
复制
//  Player.h
#import <Foundation/Foundation.h>
#import "Stem.h"

@interface Player : NSObject {

NSMutableArray *player1;

}

@property(nonatomic,retain) NSMutableArray *player1;

-(void) playAudio;

@end

最后,在Player.m中,我尝试访问索引数组

代码语言:javascript
运行
复制
#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对象-我认为这是最好的方法,但也许还有更好的方法。

代码语言:javascript
运行
复制
//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“(这就是问题所在)

代码语言:javascript
运行
复制
//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

代码语言:javascript
运行
复制
//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。编译器也不会给出错误。

代码语言:javascript
运行
复制
//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错误:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-30 22:52:09

你在播放器中的什么地方声明了stem?如果您在player.h中声明它,那么您将需要在player.h中导入stem.h,而不是player.m。

编辑:是的,它仍然是未声明的,因为你在视图控制器而不是播放器中声明了stem。嗯,这里似乎有一些不对劲的地方。这实际上取决于您的代码将如何实际工作

代码语言:javascript
运行
复制
#import Stem.h

@interface Player : NSObject {

NSMutableArray *player1;

}

@property(nonatomic,retain) NSMutableArray *player1;
@property(nonatomic,retain) Stem *stem;

-(void) playAudio;

@end

代码语言:javascript
运行
复制
import "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

然后在你的控制器中

代码语言:javascript
运行
复制
player.stem = stem;

我不确定为什么要在stem类中创建一个词干指针。

代码语言:javascript
运行
复制
@interface Stem : NSObject {

int *index;

int numberOfStems;
}

@property(nonatomic,readwrite) int *index;

如果你想要一个词干数组,那么在控制器中创建它

编辑:在你有了行之后

代码语言:javascript
运行
复制
player = [[Player alloc] init];
 [player playAudio];

添加

代码语言:javascript
运行
复制
player.stem = stem;

您必须将播放器中的指针分配给在视图控制器中创建的词干。

票数 3
EN

Stack Overflow用户

发布于 2012-01-30 22:52:23

最好的方法是在Stem类中创建一个方法,如下所示:

value =词干valueAtIndex:i;

这样就减少了耦合,并且在Stem类中保存值的方式不会公开,如果需要,可以在以后进行更改,而无需宣传访问调用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9065508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档