使用 Boost Python for C++ class 接受用户输入
Using Boost Python for C++ class which takes user input
我有一个 C++ class,它在构造函数中接受用户输入,然后将其(和其他内容)写入文件。它在 C++ 上(在 MSVC 和 GCC 上)工作得很好,现在我想在我的 Python 项目中使用这个 class。我的文件是:
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
如果有任何想法可以解决这个问题,我们将不胜感激!
提前致谢..
代码中的一个明显错误是 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
)现在应该可以正常编译了。
我有一个 C++ class,它在构造函数中接受用户输入,然后将其(和其他内容)写入文件。它在 C++ 上(在 MSVC 和 GCC 上)工作得很好,现在我想在我的 Python 项目中使用这个 class。我的文件是:
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
如果有任何想法可以解决这个问题,我们将不胜感激!
提前致谢..
代码中的一个明显错误是 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
)现在应该可以正常编译了。