我已经走进了游泳池的深处。我已经取得了一些不错的进步,但现在却步履蹒跚。我正在尝试在iOS中使用此模糊逻辑库:http://code.google.com/p/fuzzy-lite/

我已经编译好了-我要做的是将.cpp和.h文件都添加到我的项目中,并将主viewController的后缀更改为“ .mm”。我可以从viewDidload(如下所示)中运行FuzzyLite test.h文件。它运行并显示测试数据。

我需要做的是创建一个FuzzyLite的持久实例,以便可以在我的应用程序中使用它(例如,能够解决它,然后在应用程序卸载时清理它)。

我到处搜索,但不了解在ObjC项目中包含C ++代码的讨论/示例。有人可以告诉我一种前进的方式-包装FuzzyLite代码,以便我可以调用函数并返回结果吗?谢谢!

编辑:我已经使用这里详细介绍的方法在此方面取得了进展:
http://robnapier.net/blog/wrapping-c-take-2-1-486

我不清楚的一件事是内存清理。 dealloc函数清除包装的CPP实例的实例-但是在CCP实例中分配的内存又如何呢?似乎我需要在删除实例之前调用方法来释放该方法。

例如:包装的类具有一些子类的实例变量-我的清理函数是否足以正确管理内存?

void Bingo::cleanup(){

delete  engine;
engine = NULL;
delete health;
health = NULL;
delete energy;
energy = NULL;

}


包装的CPP类的标题

#include "fuzzylite/FuzzyLite.h"

namespace fl {

class Bingo {
public:
    FuzzyEngine* engine;
    OutputLVar* health;
    InputLVar* energy;
    Bingo();
    void Fuzz();

    void setInput(float input);

};
}


来自ObjC包装器:

- (void)dealloc
{
delete _cpp;
_cpp = NULL;

[super dealloc];
}


FuzzyLiteIOSViewController.mm

#include "FuzzyLiteIOSViewController.h"
#include "FuzzyLite.h"
#include "test.h"
#include <limits>
#include "fuzzylite/FunctionTerm.h"

//stuff not shown

- (void)viewDidLoad
{
   [super viewDidLoad];

   fl::Test* test = new fl::Test();
   test->SimpleMamdani();

}


测试

#ifndef FL_TEST_H
#define FL_TEST_H

namespace fl {

class Test {
public:
    static void SimpleMamdani();

};
}


#endif  /* FL_TEST_H */


测试文件

#include "fuzzylite/test.h"
#include "fuzzylite/FuzzyLite.h"
#include <limits>

#include "fuzzylite/FunctionTerm.h"
namespace fl {

void Test::SimpleMamdani() {
    FuzzyOperator& op = FuzzyOperator::DefaultFuzzyOperator();
    FuzzyEngine engine("simple-mamdani", op);
    engine.hedgeSet().add(new fl::HedgeNot);
    engine.hedgeSet().add(new fl::HedgeSomewhat);
    engine.hedgeSet().add(new fl::HedgeVery);
    fl::InputLVar* energy = new fl::InputLVar("Energy");
    energy->addTerm(new fl::ShoulderTerm("LOW", 0.25, 0.5, true));
    energy->addTerm(new fl::TriangularTerm("MEDIUM", 0.25, 0.75));
    energy->addTerm(new fl::ShoulderTerm("HIGH", 0.50, 0.75, false));
    engine.addInputLVar(energy);

    fl::OutputLVar* health = new fl::OutputLVar("Health");
    health->addTerm(new fl::TriangularTerm("BAD", 0.0, 0.50));
    health->addTerm(new fl::TriangularTerm("REGULAR", 0.25, 0.75));
    health->addTerm(new fl::TriangularTerm("GOOD", 0.50, 1.00));
    engine.addOutputLVar(health);
    fl::RuleBlock* block = new fl::RuleBlock();
    block->addRule(new fl::MamdaniRule("if Energy is LOW then Health is BAD", engine));
    block->addRule(new fl::MamdaniRule("if Energy is MEDIUM then Health is REGULAR", engine));
    block->addRule(new fl::MamdaniRule("if Energy is HIGH then Health is GOOD", engine));
    engine.addRuleBlock(block);

    for (fl::flScalar in = 0.0; in < 1.1; in += 0.1) {
        energy->setInput(in);
        engine.process();
        fl::flScalar out = health->output().defuzzify();
        (void)out; //Just to avoid warning when building
        FL_LOG("Energy=" << in);
        FL_LOG("Energy is " << energy->fuzzify(in));
        FL_LOG("Health=" << out);
        FL_LOG("Health is " << health->fuzzify(out));
        FL_LOG("--");
    }
}

最佳答案

鉴于所提供的信息,基本上不可能回答您的问题。您的问题与cleanup类的Bingo方法有关,但是Bingo实例(在堆栈或堆上)在代码摘录中无处可见。同样,您声明要清除“包装的CPP实例”,但在其他地方均未引用该实例。看来您的Test::SimplMamdani方法中存在泄漏-您在new一堆对象中[至少在显示的代码中]没有任何相应的delete。同样,在您的FuzzyLiteIOSViewController::viewDidLoad方法中,您在堆上创建一个Test实例,而没有相应的delete。我假设您的C ++代码中没有任何autoptr内容。

更新以提供其他信息:

根据您的评论,您需要查看C ++的基本语言结构。基本规则是您需要delete new的任何内容。 Bingo类的清理应在析构函数(Objective-C的dealloc的C ++构造)中执行。您的Bingo类应类似于:

宾果游戏:

namespace fl {
    class Bingo {
    public:

        Bingo();
        virtual ~Bingo();

        void Fuzz();
        void setInput(float input);

        FuzzyEngine* engine;
        OutputLVar* health;
        InputLVar* energy;

    protected:
    private:
    };
}


Bingo.cpp:

using namespace fl;

Bingo::Bingo() {
}

Bingo::~Bingo() {
    if (engine) {
        delete engine;
    }
    if (health) {
        delete health;
    }
    if (energy) {
        delete energy;
    }
}


当您delete一个Bingo实例时,析构函数将被调用,而Bingo的成员变量将被处置。

可以说,您的成员变量(引擎,健康状况和能源)应该在范围上是私有的,并通过公共范围的getter和setter公开。

可以获取Bjarne Stroustrup的C ++参考副本,并快速阅读,或使用this one之类的在线起步指南。

10-05 23:27