使用Boost Python for C ++类来获取用户输入

时间:2015-01-23 21:46:34

标签: c++ visual-studio-2012 gcc boost boost-python

我有一个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 个答案:

答案 0 :(得分:0)

代码中的一个明显错误是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)现在应该可以正常编译。