1

我想做的很简单,但我可能语法错误。

我有一个带有Note class参数的 Objective-C 接口。Note.h 是一个 C++ 类,基本上看起来像这样:

#include <string>
using namespace std;

class Note {
public:
    string name;
    Note(string name){
        this->name = name; // ERROR: Cannot find interface declaration for 'Note'
    }

};

这是我使用 Note 的控制器。我将文件扩展名更改为 .mm

@class Note;
@interface InstrumentGridViewController : UIViewController {
@public
    Note* note;
}
@property (nonatomic, retain) Note* note;

这就是我使用它的方式:

@implementation InstrumentGridViewController
@synthesize note;

- (void)buttonPressed:(id)sender {
    note = Note("fa"); // ERROR: Cannot convert 'Note' to 'Note*' in assignment
    NSLog(@"naam van de noot is %s", note->name); // ERROR: Cannot find interface declaration for 'Note'
}

我收到了这三个错误(我已将它们作为注释添加到正确的行中)

知道我做错了什么吗?

4

3 回答 3

0

您需要Note使用以下方式分配对象new

- (void)buttonPressed:(id)sender
{
    if (note != 0)
        delete note;
    note = new Note("fa");
    NSLog(@"naam van de noot is %s", note->name.c_str());
}

但是,在按钮按下操作方法中这样做似乎不正确......

也不要忘记delete在你的对象的dealloc方法中:

- (void)dealloc
{
    delete note;
    [super dealloc];
}

最后,您的@property属性retain是错误的,因为它不是 Objective-C 对象;而是使用assign并更好地制作它readonly

初始化大多数对象的更好方法是使用const对它们的引用而不是副本:

Note(const string &name)
{
    this->name = name;
}
于 2012-07-23T16:59:23.670 回答
0

您的 Note C++ 类无效。将其声明改为:

class Note {
public:
    string name;
    Note(string aName) {
        name = aName;
    }
};

还要改变你的InstrumentGridViewController

- (void)buttonPressed:(id)sender {
    note = new Note("fa");
    NSLog(@"naam van de noot is %s", note->name);
}

- (void)dealloc {
    delete note;
    [super dealloc];    // Use this only if not using ARC
}
于 2012-07-23T17:07:21.640 回答
0

Cannot find interface declaration for 'Note'错误是由于@class NoteObj-C controller .h file.的It's奇怪引起的,因为我有一个正在@class使用的工作示例项目并且它工作正常。

我使用前向声明修复了它,就像这里这里描述的那样。

// used typedef struct <classname> <classname>
typedef struct Note Note;

// instead of
@class Note

以上内容位于 Obj-C 头文件中。在 .mm 文件中#import "Note.h"声明

于 2012-07-23T19:36:15.480 回答