0

まず、私は Objective-C の初心者です。現時点では、次の問題を解決しようとしています。

@interface Animal : NSObject {
  @private
  NSString* m_name;
}
-(Animal*) initName:(NSString*)name;
-(void) printName;

@implementation Animal
-(Animal*) initName:(NSString*)name {
  self = [super init];
  m_name = name;
  return self;
}
-(void) printName {
  NSLog(@"%s", m_name);
}
@end

@interface Bird : Animal {
}
-(Bird*) initName:(NSString*)name;

@implementation Bird
-(Bird*) initName:(NSString*)name {
  self = [super initName:name];
  return self;
}
@end

int main() {
  Animal* bird = [[Bird alloc] initName:@"abird"];  // warning: assignment from distinct Objective-C type
  [bird printName];  // prints invalid letters
  [bird release];
}

コンストラクターの引数をスーパークラスに継承したいのですnameが、うまくいきません。また、コンストラクター内に名前を出力しようとしましたが、成功しませんでした。

必要なすべてのヘッダーが含まれています。warning: assignment from distinct Objective-C type [enabled by default]子クラス オブジェクトを作成するときの警告は、私が受け取る唯一の警告です。

この問題を解決する方法を知っている人はいますか?

こんにちはダン

4

1 に答える 1

4

m_nameではNSStringなく、char *です。%@の代わりにフォーマット指定子を使用してログに記録する必要があります%s。フォーマット文字列のドキュメントを読んでください。

コメント:

  • Objective-C は C++ ではありません。C++ スタイルの命名規則を強制しようとしないでください。そのインスタンス変数nameを 、またはanimalNametheNameまたは何でも呼び出します。と呼ばないでくださいm_name

  • 初期化子は慣習的に と呼ばれinitWithWhatever:、 ではありませんinitWhatever:。メソッドの目的をよりよく反映しています (名前自体ではなく、名前でオブジェクトを初期化します)。

  • の戻り値を確認してください [super init]。が返された場合nil、イニシャライザはクラッシュします。慣用的な解決策はif (self = [super initWithName:name])

  • イニシャライザ メソッドは、従来どおり、 を返しidます。

于 2013-06-25T09:05:33.880 に答える