2012-01-27 9 views
0

キュー(CHCircularBufferQueue)に一連のchar *オブジェクトを追加する際に問題があります。キューはオブジェクトを入力として受け取ります(私が理解する限り)ので、単純にchar * tokenNameを含むtokenObjectというNSObjectから継承された単純なオブジェクトを作成しました。キューに新しいtokenObjectを追加するたびに、新しいtokenObjectを割り当ててから、次回キューに追加するときに新しいトークンをキューに渡します。しかし、tokenObject.tokenNameを新しいchar *文字列に設定すると、QueueのすべてのtokenObjectがオーバーライドされるため、Queue全体を印刷すると、一意の文字列ではなく同じ文字列が返されます。私は間違って何をしていますか?オブジェクトの新しいインスタンスは、キューまたはスタックに追加するたびに作成する必要がありますか? Objective-C

このObjective-Cで以下

がmain.m & tokenObject.h main.mから​​コードされる:

int main (int argc, const char * argv[]) 
{ 
    CHCircularBufferQueue *tokenQueue = [[CHCircularBufferQueue alloc] init]; 
    tokenObject *myTokenObject = [[tokenObject alloc] init]; 


TK currentToken; 
initScanner(); 
scanToken(); 
[myTokenObject setTokenName:getToken() ]; 
currentToken = getTkrep(); 

int x=0; 

while (x<5/*currentToken != TK_EOF*/) { 


     //printf("line number: %d, token value: %d, token string: %s\n", getLinenumber(), getTkrep(), getToken()); /* replace line with "add to queue" */ 
    scanToken(); 
    myTokenObject.tokenName = getToken(); 
    [tokenQueue addObject:myTokenObject]; 
    myTokenObject = [[tokenObject alloc] init]; 
    currentToken = getTkrep(); 


    x = x+1; 
} 

while(x != 1){ 
    printf("%s", [[tokenQueue firstObject] tokenName]); 
    [tokenQueue removeFirstObject]; 
    x = x-1; 

    printf("%i", x); 
} 
return 0; 

}

tokenObject.h:

@interface tokenObject : NSObject{ 

    char *tokenName; 
} 
@property (assign) char* tokenName; 

@end

+0

何かを追加するたびに新しいオブジェクトを作成する必要はありませんが、カスタムオブジェクトにtokenNameポインタが1つしかないため、別のオブジェクトが必要です。 (なぜNSStringオブジェクトを追加するだけでいいですか?) –

+0

'getToken'は何をするのですか?あなたが解放する責任を負っている、新しく割り当てられた文字列を返しますか、それとも内部的に保持して変更する可能性のある文字列ですか?つまり、NSStringを使用していない理由については、Second Licksの質問にも言います。 – nil

+0

自分自身をサブクラス化する代わりにNSStringを実装しようとしていますが、それをどのように実装すればよいでしょうか? getToken()はchar *を返し、私の教授から提供されたので、コードのその部分を変更することはできません。 NSStringのセッター機能は何ですか? – kabirpong

答えて

0

サンプルは、いくつかの点でココアのベストプラクティスに反するものです。まず、main.mではなく、アプリケーションのデリゲートで機能を開始します。

しかし、あなたの質問に答えるには、char *の代わりにNSString *を使用してみてください。あなたのカスタムTokenObjectは文字列を持つ以外の何かをしますか?その場合は、サブクラス化を避け、NSStringを直接割り当て/割り当ててキューに追加してください。あなたは結果をあなたの予想以上に見つけなければなりません。

+1

私は彼がコマンドラインアプリケーションを作っていると思います。ユーザーインターフェイスを持つアプリケーションではなく、アプリケーションデリゲートを必要としないアプリケーションです。 – dreamlax

+0

フィードバックいただきありがとうございます、私は今すぐそれを試してみます。ココアの練習の話題で、私のコードはどこから始めるのですか?私はobjective-cクラス用のコマンドライン解析ツールを作成しています。それは私のプロジェクトにも当てはまりますか? (私は初めて客観的なCを学んでいるので、私の質問が馬鹿に見える場合は私の言い訳) – kabirpong

+0

問題はない、問題は愚かではない、我々はすべてどこかで始まる。コマンドラインツールを作成している場合、main.mは実際には問題ありません。 – isaac

0

はい。キューの各メンバーには一意のオブジェクトが必要です。それ以外の場合は、キューに同じオブジェクトを何度も繰り返し読み込んでいます。したがって、毎回myTokenObject.tokenName = getToken();を実行するたびに、キュー全体のすべてのトークンが上書きされます。キュー内の位置ごとに一意のオブジェクトを作成すると、各オブジェクトに一意のトークンが保持されます。

+0

彼のコードを見ると、彼は各トークンに新しいオブジェクトを割り当てています。したがって、彼はキュー内のすべてのトークンを変更していません。 'getToken'メソッドがアドレスをいくつかのバッファに返して、それが各トークンに対して変更される可能性が高いようです。 – nil

関連する問題