Использование Boost Python для класса C++, который принимает пользовательский ввод

У меня есть класс C++, который принимает пользовательский ввод в конструкторе, а затем записывает это (и другие вещи) в файл. Он отлично работает на C++ (как на MSVC, так и на GCC), и теперь я хотел бы использовать этот класс в своих проектах на Python. Мои файлы:

foo.h

#include <iostream>
#include <fstream>
#include <stdio.h>

class Foo
{
public:
    explicit Foo(const std::string file_name, const std::string other_input);
    virtual ~Foo();
    void Write(const std::string random_text);

private:
    std::ofstream output_file;
    char buffer[200];
    std::string random_string;
};

foo.cpp

#include <Python.h>
#include <boost/python.hpp>
#include <boost/shared_ptr.hpp>

// Constructor
Foo::Foo(const std::string file_name, const std::string other_input)
{
    std::ifstream file_exists(file_name)
    if(file_exists.good())
        output_file.open(file_name, std::ios_base::app);
    else
        output_file.open(file_name);

    random_string = other_input;
}

// Destructor
Foo::~Foo()
{
    output_file.close();
}

// Write to a file
void Foo::Write(const std::string random_text)
{
    sprintf( buffer, "%s", random_string );

    output_file << buffer << ";\n";
}

// Boost.Python wrapper
BOOST_PYTHON_MODULE(foo)
{
    boost::python::class_<Foo>("Foo", boost::python::init<>())
        .def("Write", &Foo::Write)
        ;
}

Когда я пытаюсь скомпилировать это в Visual Studio или GCC, я получаю следующую ошибку:

'std::basic_ofstream<_Elem,_Traits>::basic_ofstream' : cannot access private member declared in class 'std::basic_ofstream<_Elem,_Traits>'

Я полностью сбит с толку относительно того, почему это так. Я попробовал другой вариант обертки, а именно:

// Boost.Python wrapper
BOOST_PYTHON_MODULE(foo)
{
    boost::python::class_<Foo, boost::noncopyable>("Foo", boost::python::init<>())
        .def("Write", &Foo::Write)
        ;
}

И тут я получаю ошибку:

'Foo' : no appropriate default constructor available

Любые идеи, чтобы получить это на каблуках, будут высоко оценены!

Заранее спасибо..

1 ответ

Решение

Одна очевидная ошибка в вашем коде заключается в том, что FooКонструктор принимает два параметра, которые вы не включили в оболочку:

// Boost.Python wrapper
BOOST_PYTHON_MODULE(foo)
{
    boost::python::class_<Foo, boost::noncopyable>("Foo",
       boost::python::init<const std::string, const std::string>())
     .def("Write", &Foo::Write)
     ;
}

Это объясняет вторую ошибку и эту версию (с noncopyable) теперь должен скомпилироваться нормально.

Другие вопросы по тегам