質問

私はUtilsのクラスで最小と最大のメソッドを定義したい。

@interface Utils

int min(int a, int b);
int max(int a, int b);

@end
しかし、私は名前付きパラメータを持っている必要はありません。それはあまりにも重い表記になります。私はCスタイルの定義を使用していました。呼び出しが仕事をしないようしかし、その後[Utils min(a, b)]。私の問題は何ですか?

任意の助けを事前に感謝します。

役に立ちましたか?

解決

あなたはObjective-CののOS Xの実装を使用していないので、

は、事前に定義されたMINとMAXのマクロへのアクセス権を持っていない可能性があります。

は、

としてこれらを自分で定義することができます
#define MIN(a,b)    ((a) < (b) ? (a) : (b))
#define MAX(a,b)    ((a) > (b) ? (a) : (b))

は、それらを定義するためのより良い方法はおそらくありますが、これらは、あなたの使用のための簡単なマクロを作成します。あなたは、あなたのクラスは、通常、共有そのいずれかの一般的な.hファイルにそれらを追加することができます。

他のヒント

はこれは既にマクロとして定義されます。

MIN(a, b)

MAX(a, b)

あなたはこれらのものを再定義する必要がいけない。

(この記事の執筆時点で有効な解決策としてマークされている)ブランドンBodnarさんによって投稿溶液で深刻な問題があります。

問題は、ここで説明する:のhttp:/ /gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Min-and-Max.htmlする そして、それまで(有効&安全な)解決策:のhttp:/ /gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Typeof.htmlする

自分でそれをチェックアウト:

#include <stdio.h>

#define NAIVE_MAX(a,b) (a > b ? a : b)

#define NAIVE_MIN(a,b) (a < b ? a : b)

#if !defined MAX
#define MAX(a,b) \
({ __typeof__ (a) __a = (a); \
__typeof__ (b) __b = (b); \
__a > __b ? __a : __b; })
#endif

#if !defined MIN
#define MIN(a,b) \
({ __typeof__ (a) __a = (a); \
__typeof__ (b) __b = (b); \
__a < __b ? __a : __b; })
#endif

int main (int argc, const char * argv[]) {
    int a = 3;
    int b = 5;

#pragma mark NON-FATAL CASES:
    printf("NAIVE_MAX(%d, %d) => %d\n", a, b, NAIVE_MAX(a, b));
    printf("NAIVE_MIN(%d, %d) => %d\n", a, b, NAIVE_MIN(a, b));

    printf("MAX(%d, %d) => %d\n", a, b, MAX(a, b));
    printf("MIN(%d, %d) => %d\n", a, b, MIN(a, b));

    printf("\nEverything fine so far...\n\n");

#pragma mark FATAL CASES:
    //cache:
    int _a = a;
    int _b = b;
    printf("NAIVE_MAX(%d++, %d++) => %d\n", _a, _b, NAIVE_MAX(a++, b++));

    //reset:
    a = _a;
    b = _b;
    printf("NAIVE_MIN(%d++, %d++) => %d\n", _a, _b, NAIVE_MIN(a++, b++));

    //reset:
    a = _a;
    b = _b;
    printf("NAIVE_MAX(++%d, ++%d) => %d\n", _a, _b, NAIVE_MAX(++a, ++b));

    //reset:
    a = _a;
    b = _b;
    printf("NAIVE_MIN(++%d, ++%d) => %d\n", _a, _b, NAIVE_MIN(++a, ++b));

    printf("\nOuch, this doesn't look right at all!\n\n");

#pragma mark NON-FATAL CASES:
    //reset:
    a = _a;
    b = _b;
    printf("MAX(%d++, %d++) => %d\n", _a, _b, MAX(a++, b++));

    //reset:
    a = _a;
    b = _b;
    printf("MIN(%d++, %d++) => %d\n", _a, _b, MIN(a++, b++));

    //reset:
    a = _a;
    b = _b;
    printf("MAX(++%d, ++%d) => %d\n", _a, _b, MAX(++a, ++b));

    //reset:
    a = _a;
    b = _b;
    printf("MIN(++%d, ++%d) => %d\n", _a, _b, MIN(++a, ++b));

    printf("\nAh, much better now.\n\n");

    return 0;
}

コンソールログます:

NAIVE_MAX(3, 5) => 5
NAIVE_MIN(3, 5) => 3
MAX(3, 5) => 5
MIN(3, 5) => 3

Everything fine so far...

NAIVE_MAX(3++, 5++) => 6
NAIVE_MIN(3++, 5++) => 4
NAIVE_MAX(++3, ++5) => 7
NAIVE_MIN(++3, ++5) => 5

Ouch, this doesn't look right at all!

MAX(3++, 5++) => 5
MIN(3++, 5++) => 3
MAX(++3, ++5) => 6
MIN(++3, ++5) => 4

Ah, much better now.

だから、を決して上記のコードに見られるように、の素朴な実装を使用(とブランドンBodnarさん、ごめんバディによって示唆されるように;)。)あなたはこのような最悪のケースを回避したい場合は、

これはおそらく、この特定のアプリケーションのための良いアイデアではありませんが、それは、の可能性の「名前なし」のパラメータを持つObjective-Cのメソッド、またはむしろゼロの長さの名前を持つを書くことです。

+ min:(int)a :(int)b;
...
[Utils min:a :b]

(セレクタ@selector(min::)であろう。)

Objective-Cのクラスのメソッドは、名前付きパラメータ、ピリオドを使用します。それはそれがあるだけの方法です。

なぜグローバル、フリー機能しませんか?あなたはこの種のもののためのUtilsクラスは必要ありません。

あなたがグローバル名前空間を乱雑にしたくない場合は、

、あなたは(.mmへのすべての.mファイルの名前を変更)のObjective-C ++を使用して名前空間にそれを置くことができます。

"XXIntegerMath.h" このドロップ...

という名前のテンプレートファイルで
#import <Foundation/Foundation.h>

static inline NSInteger imax(NSInteger a, NSInteger b) {
    return  a > b ? a : b;
}

static inline NSInteger imin(NSInteger a, NSInteger b) {
    return  a < b ? a : b;
}

次に、あなたのObjective-Cのクラスで...

#import "XXIntegerMath.h"
NSInteger minValue = imin(someValue, someOtherValue);

これはRegexidentによって記述問題に悩まされていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top