2015-01-23 4 views
0

나는 생성자에서 사용자 입력을 받아서 그 파일 (그리고 다른 것들)을 파일에 쓴다. C++ (MSVC와 GCC 모두)에서 완벽하게 작동하며 이제는이 클래스를 Python 프로젝트에 사용하고 싶습니다. 내 파일은 다음과 같습니다사용자 입력을 받아들이는 C++ 클래스 용 Boost 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) 
     ; 
} 

내가 비주얼 스튜디오 나 GCC에이를 컴파일 할 때, 나는 다음과 같은 오류를 얻고있다 :

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

이것이 왜 그런지에 대해 완전히 혼란 스럽습니다. 발 뒤꿈치에이 높게 평가 될 것이다 얻을

'Foo' : no appropriate default constructor available 

모든 아이디어 : 나는 오류가 여기

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

을 그리고 : 나는 즉, 래퍼의 또 다른 변형을 시도했다! 사전에

감사합니다 ..

답변

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)은 이제 제대로 컴파일되어야합니다.

+0

이것은 완벽하게 작동했습니다! 그러나 파이썬 래핑 라이브러리를 빌드하는 동안 이상한 오류가 발생합니다. 나는 다른 질문을하지만 여기에 관련 질문 (https://stackoverflow.com/questions/28152546/linkage-errors-while-building-wrapping-class-using-boost-python). 당신이 볼 수 있다면 그것은 최고 일 것입니다. 감사! – scap3y