Проблема наследования при связывании нативных методов C ++ в Chaiscript - PullRequest
0 голосов
/ 07 июля 2010

Я использую этот код для проверки некоторых свойств набора объектов Qt в ChaiScript:

    /// initialize the engine
    boost::shared_ptr<chaiscript::ChaiScript> chai;
    chai.reset(new chaiscript::ChaiScript());
    std::cout << "ChaiScript engine created!!!" << std::endl;


    ///
    /// register elements
    //
    assert(ui->checkBox);
    chai->add(chaiscript::var(ui->checkBox), "checkBox");

    ///
    /// adapt elements

    /// QCheckBox
    chai->add(chaiscript::fun(&QCheckBox::isTristate), "isTristate");
    chai->add(chaiscript::fun(&QCheckBox::isChecked), "isChecked");


    /// validate some properties
    try
    {
        chai->eval("print(\"Starting evaluation...\")");
        int answer_i = 0;
        bool answer_b = false;
        //answer_b = chai->eval<bool>("checkBox.isTristate()");
        answer_b = chai->eval<bool>("checkBox.isChecked()");

        std::cout << "ChaiScript::: " << answer_b << " :: " << answer_i << std::endl;
    }
    catch(std::exception e)
    {
        std::cout << "ChaiScript@Exception::: " << e.what() << std::endl;
    }

Проблема состоит в том, что вызов isTristate () работает, потому что это собственный метод QCheckBox,С другой стороны, вызов isChecked () завершается неудачно, я думаю, потому что это унаследованный метод из класса QAbstractButton.

Что я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Последняя версия SVN ChaiScript решает эту проблему, позволяя пользователю добавлять связи базового класса.

chai.add(base_class<Base, Derived>());

После этого вызовы унаследованных функций работают, как и ожидалось, без необходимости уточнения указателя метода базового класса.введите, как показывает ваш ответ.

0 голосов
/ 07 июля 2010

Проблема была решена следующим образом:

/// method binding
chai->add(chaiscript::fun<bool (QCheckBox *)>(&QCheckBox::isChecked), "isChecked");

Необходимо указать, что связанный метод принадлежит классу QCheckBox, чтобы не связывать ссылку на родительский метод.

Ура !!!

...