5

私は構造体と共用体全体にかなり慣れていないと言って始めましょう。これを投稿する前に宿題をして、正直に正当な説明を得ようとしました. これが間違っている場合は、私に知らせてください。まず、異なるデータ型を組み合わせているため、ユニオンを作成しようとしています。私の唯一の本当の問題/質問は、ドット演算子と->です。を使用して作業したいものを取得できます

->

しかし、そうではありません

.

なぜなのか気になりますか?「。」を使用して例または「回答」を示すスタック上の一連の投稿を読みますが、現実の世界では運がありません。私は「typedef」のように遊んだ...

typedef union _myUnion
{
     int intValue;
     bool boolValue;
}myUnion;

しかし、それは違いを生むものではありません。誰かが私が間違っていることを説明してくれれば、それは大歓迎です。これが私がやろうとしていることの簡単なサンプルです。簡単にするために、いくつかの構造体/共用体の構文を投稿するだけで、サブクラス化コードは追加しません。これは問題ではないためです。

たとえば .h

#import "<Foundation/Foundation.h"

union myUnion
{
   int intValue;
   bool boolValue;
};

@interface MyClass : NSObject
{
    union myUnion *someProperty;
}

@property (nonatomic, assign) union myUnion *someProperty;

-(void)doSomething;

@end

たとえば .m

#import "MyClass.h"

@implementation MyClass

@synthesize someProperty = _someProperty;

- (id)init
{
//Some init method...
}

- (void)doSomething
{
    NSLog(@"I Did Something...");
}

@end

だから今、私の他のクラスではこれが機能します...

MyClass *newObject = [MyClass alloc] init];
newObject.someProperty->intValue = 6;

しかし、これはそうではありません...

MyClass *newObject = [MyClass alloc] init];
newObject.someProperty.intValue = 6;

この時点で、なぜ後者が機能しないのかを学ぶことにもっと興味がありますか? 興味深いのは、プロパティの .h ファイルでポインターを削除した場合です。

@interface MyClass : NSObject
    {
        union myUnion someProperty;
    }

@property (nonatomic, assign) union myUnion someProperty;

「。」「->」の代わりに機能しますが、現在は割り当てられません。

補足として、bool を int に変更して構造体にすると、同じことが起こります。残念ながら、私は最初にobjective-cに習熟し、徐々に厳密なcを習得しています。私の c の理解は少し弱いですが、それが obc の利点です。1 つの言語の価格で 2 つの言語を学べます。open-glをカウントしない場合。

誰かがコードの実際の例を投稿して、自分が何を間違えたのかを理解できるか、または何が間違っているのか、および見逃した基本的な概念のいくつかを徹底的に説明できるかどうかを尋ねます。そこから、自分の作業コードを書く方法を理解できます。私は両方を必要とせず、配布を期待していませんが、それがどのように、またはなぜ機能するかを理解せずにバグのあるコードにパッチを当てるだけでなく、自分の問題を解決できるように学びたいと思っています。

4

2 に答える 2

8

a->b演算子は の省略形です。(*a).bこれは、を使用するのと似ています.が、最初に逆参照を行います。aがポインターの場合に適しています。

元の例somePropertyではユニオンへのポインターであるため、最初にそのポインターを逆参照する必要があります。これは、次のいずれかを使用する必要があることを意味します。

(*newObject.someProperty).intValue // confusing!

または

newObject.someProperty->intValue // much better

をクリックしてアクセスします。

もちろん、someProperty共用体へのポインターではなく共用体に変更したら、代わりに を使用できます.。そう:

  • a->b: ポインタ上の構造体/共用体メンバにアクセスします
  • a.b: 生の構造体/共用体の構造体/共用体メンバーにアクセスします
于 2012-04-26T00:35:07.727 に答える
5

この場合、共用体を外部メモリの場所へのポインターではなく、値として使用する可能性が非常に高くなります。

@interface MyClass : NSObject
{
    union myUnion someProperty; // << no '*'
}

@end

次に、期間をメンバー アクセスに使用します。

someProperty.intValue = 6;

それポインタの場合:

someProperty->intValue = 6;

ただし、別の問題があります。ユニオンをプロパティとして使用するには、2 つの (主要な) オプションがあります。値またはポインター。これは通常、値によって処理されます。特に、すべてのフィールドが構造体/共用体に対してローカルなメモリを参照する場合、およびフィールド ID が大きくない場合です。この場合、多くの場合、値を返したり設定したりします。これは、プログラムが次のように記述されることを意味します。

@interface MyClass : NSObject
{
    union myUnion someProperty;
}

@property (nonatomic, assign) union myUnion someProperty; // << by value

@end

次に、クライアントは次のようにアクセスして値で設定できます。

union myUnion p = obj.someProperty;
++p.intValue;
obj.someProperty = p;

それが、共有リソースを参照しない小さな構造で達成されることが多い方法です。

もちろん、フィールドに直接アクセスすることを選択した場合、インスタンスが直接アクセスできる場合はコピーは必要ありません。

- (void)doSomething
{
  ++someProperty.intValue;
}

これが複雑になる場合は、メソッドの背後にあるデータを抽象化MyClassし、アクセスと変更を共用体を保持するインスタンスに任せることをお勧めします。

于 2012-04-26T00:34:59.983 に答える