【问题标题】:Objective C in C++ – Out of ScopeC++ 中的 Objective C – 超出范围
【发布时间】:2010-02-02 17:21:10
【问题描述】:

我对 WOsclib 有一点问题。不是特别是库,它更多的是回调函数。听特定的 osc 命令我必须提出一些回调方法,例如

void TheOscStartMethod::Method(
                          const WOscMessage *message,
                          const WOscTimeTag& when,
                          const TheNetReturnAddress* networkReturnAddress)
{
    std::cout << "Got the start signal";
    start.alpha = 1.0;
}

开始是 IBOutlet UIImageView。

但是编译器告诉我,那个开始超出了范围。如果我尝试在 obj-c 代码中访问 start,它会正常工作。

如何将我的 Objective C 对象放入 c 代码中,或者至少调用一个 Objective-c 函数。

谢谢

【问题讨论】:

    标签: c++ iphone objective-c scope


    【解决方案1】:

    使文件成为扩展名为 .mm 的目标 C++ 文件然后您可以在同一代码中调用对象 C 和 C++ 对象。

    XCode将从文件扩展名中调用正确的编译器(即在编译命令中添加-x Objective-c++)

    并不是说 C++ 和目标 C 是不同的语言并且不理解彼此的对象,因此要在它们之间移动数据,您需要将数据转换为 C 类型,例如void、char int 和指向它们的指针。

    【讨论】:

    • 嗯,我已经这样做了,不是文件扩展名,而是在信息面板中。现在看起来像这样:grab.by/28Ld
    • 啊,那我想这不是问题所在。我们需要查看 start 类的标题吗?
    • 就像我说的,start 是一个 UIViewImage。也许我应该选择一个更好的例子。 start 可能是一种方法。 [self methodName] 也不起作用。
    • 好的,它说 start 超出范围 - start 在哪里声明?
    • Start 在标头中声明为 'IBOutlet UIButton* start;' 据我所知,c++ 代码的作用域超出了目标 c 容器对象。即使我把它写在特定的对象中。
    【解决方案2】:

    听起来start 是属于某个Objective-C 对象的实例变量,而您试图通过从C++ 对象中写入其名称来访问它。如果是这种情况,那么它为什么不起作用应该很明显:C++ 对象对start 一无所知。解决方案是以某种方式为 C++ 对象提供对拥有 start 的 Objective-C 对象的引用。

    【讨论】:

    • 我的解释尽可能具体。你如何做到这一点没有一般的答案。您必须构建您的程序,以便您的代码知道它需要的数据。这个程序结构具体是什么样子取决于程序的细节,我们在这里没有。
    • 呃,现在我想深入研究一些我完全不知道的东西。但是让我们尝试一下。我有一个普通的 AppDelegate 处理一些按钮和标签。这对我来说很好。困难的部分是我正在使用的 OSC 库。那是用 C++ 编写的,但与平台无关。我实现了它并且它有效。我可以通过网络发送接收 osc 信号。现在,如果我得到一个 osc 信号,就会调用一个特定的方法,一个 c++ 方法。那是我的问题开始。我想用那个方法来改变界面。不知道这是否有助于说明我的情况?还是谢谢你:)
    【解决方案3】:

    您必须使 start 对象可用于您的其他代码。

    你可以传递它,你可以传递你将使用的部分,你可以创建一个 API 供两个代码库使用。还有其他选项,完全取决于您希望如何使用各种对象

    【讨论】:

      【解决方案4】:

      解决方案:

      我不知道这是否是最好的方法,但它确实有效。

      必须有一个空的 c 对象,稍后它将成为我们的目标 c 对象,其中包含我们要访问的所有内容。

      static gsSearchForIp* delegate = NULL;
      

      我们必须定义一个函数来设置目标 c 对象

      void setCallbackDelegate(gsSearchForIp* del)
      {
          delegate = del;
      }
      

      然后调用它。 (我在initWithFrame方法中调用它)

      setCallbackDelegate(self);
      

      现在我可以在我的 c++ 方法中调用带有 [delegate methodName:firstPara] 的方法。在这个函数中,我可以从 gsSearchForIp 类中访问我需要的所有东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 2012-12-24
        • 2012-04-28
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多