【问题标题】:passing shared_ptr to std::fstream * EDIT将 shared_ptr 传递给 std::fstream * 编辑
【发布时间】:2011-03-26 11:00:22
【问题描述】:

我在理解shared_ptr doc 时遇到了一些问题,因为我是 C++ 的新手。我希望你能帮助我的示例代码:

#include <iomanip>
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/multi_array.hpp>
#include <boost/lexical_cast.hpp>
#include <cstdlib>
#include <fstream>   // file I/O
#include <sstream>

void open_file( boost::shared_ptr< std::fstream > &file_stream , const std::string file_name , uint8_t presition );

int main( int argc, char* argv[] ) {

    uint32_t         num_bits = 12;
    std::fstream     *ls_coeff_p;
    boost::multi_array< boost::shared_ptr< std::fstream> , 2> ls_coeff_f( boost::extents[ num_bits ][ 2 ] );

    std::string  ls_coeff_file_name = "datafiles/ls_coeff";
    std::string  stable             = "_stable_";
    std::string  unstable           = "_unstable_";
    std::string  file_name_end      = ".log";

    for ( uint8_t i = 0; i < num_bits ; i++ ) {             
            open_file( ls_coeff_f[i][0] , ls_coeff_file_name + unstable + boost::lexical_cast<std::string>(i) + file_name_end , 4 );
            open_file( ls_coeff_f[i][1] , ls_coeff_file_name +   stable + boost::lexical_cast<std::string>(i) + file_name_end , 4 );
    }

    // just as test case
    ls_coeff_p = ls_coeff_f[0][0];

    *ls_coeff_p << "Hallo world!" << std::endl;

    for ( uint8_t i = 0; i < num_bits ; i++ ) {
            ls_coeff_f[i][0]->close();
            ls_coeff_f[i][1]->close();
    }

}

void open_file( boost::shared_ptr< std::fstream > &file_stream , const std::string file_name , uint8_t presition ) {

    file_stream->open ( file_name  , std::fstream::out );
    file_stream->precision( presition );
    file_stream->setf(std::ios::fixed,std::ios::floatfield);

}

我收到以下错误:

 In function 'int main(int, char**)':
 Line 30: error: cannot convert 'boost::shared_ptr<std::basic_fstream<char, std::char_traits<char> > >' to 'std::fstream*' in assignment
 compilation terminated due to -Wfatal-errors.

问候

编辑

应用@Space_C0wb0y 的建议后:

#include <iomanip>
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/multi_array.hpp>
#include <boost/lexical_cast.hpp>
#include <cstdlib>
#include <fstream>   // file I/O
#include <sstream>

void open_file( boost::shared_ptr< std::fstream > &file_stream , const std::string file_name , uint8_t presition );

int main( int argc, char* argv[] ) {

     uint32_t         num_bits = 12;
     std::fstream     *ls_coeff_p;
     boost::multi_array< boost::shared_ptr< std::fstream> , 2> ls_coeff_f( boost::extents[ num_bits ][ 2 ] );

     std::string  ls_coeff_file_name = "datafiles/ls_coeff";
     std::string  stable             = "_stable_";
     std::string  unstable           = "_unstable_";
     std::string  file_name_end      = ".log";

     for ( uint8_t i = 0; i < num_bits ; i++ ) {             
          open_file( ls_coeff_f[i][0] , ls_coeff_file_name + unstable + boost::lexical_cast<std::string>(i) + file_name_end , 4 );
          open_file( ls_coeff_f[i][1] , ls_coeff_file_name +   stable + boost::lexical_cast<std::string>(i) + file_name_end , 4 );
}

    // just as test case
    ls_coeff_p = ls_coeff_f[0][0].get();

    *ls_coeff_p << "Hallo world!" << std::endl;

    for ( uint8_t i = 0; i < num_bits ; i++ ) {
        ls_coeff_f[i][0]->close();
        ls_coeff_f[i][1]->close();
    }

}

void open_file( boost::shared_ptr< std::fstream > &file_stream , const std::string file_name , uint8_t presition ) {

    file_stream->open ( file_name.c_str()  , std::fstream::out );
    file_stream->precision( presition );
    file_stream->setf(std::ios::fixed,std::ios::floatfield);

}

我收到以下错误:

t: /usr/local/include/boost/shared_ptr.hpp:315: T* boost::shared_ptr<T>::operator->() const [with T = std::basic_fstream<char, std::char_traits<char> >]: Assertion `px != 0' failed.

我调试了一下,发现问题出在

 file_stream->open ( file_name.c_str()  , std::fstream::out );

如果它不在函数open_file 内,我也会遇到同样的错误

【问题讨论】:

  • 答案非常好,只有 2 个注意事项:您将因未初始化指针而出现运行时错误。作为一般准则,请尝试在使用的指针上保持一致。如果共享指针超出范围或您“删除”了指针,则使用指向共享资源的秃头指针可能会导致麻烦。
  • @AndreasT,这是我忘记的初始化行吗:ls_coeff_f[i][0] = boost::shared_ptr&lt;std::fstream&gt;(new std::fstream ); 我是这样写的吗?还是?
  • 我编辑了我的答案以涵盖这一点。

标签: c++ boost shared-ptr boost-smart-ptr


【解决方案1】:

您可以使用get 成员获取shared_ptr 的基础指针。更好的选择是将ls_coeff_p 也设为shared_ptr

你也可以跳过临时变量而做

*(ls_coeff_f[0][0]) << "Hello world" << std::endl;

【讨论】:

    【解决方案2】:

    要访问shared_ptr 中的原始指针,您必须使用get 方法:

    ls_coeff_p = ls_coeff_f[0][0].get();
    

    关于您的编辑:

    您必须先初始化数组中的共享指针,然后才能使用它们。这是我的做法:

    boost::shared_ptr<std::fstream> open_file( const std::string file_name , 
                                               uint8_t presition ) {
        boost::shared_ptr<std::fstream> stream = boost::make_shared<std::fstream>( 
            file_name.c_str(), std::fstream::out )
        stream->precision( presition );
        stream->setf(std::ios::fixed,std::ios::floatfield);
        return stream;
    }
    
    for ( uint8_t i = 0; i < num_bits ; i++ ) {
                ls_coeff_f[i][0] = open_file( ls_coeff_file_name + unstable + 
                                              boost::lexical_cast<std::string>(i) + 
                                              file_name_end , 4 );
                ls_coeff_f[i][1] = open_file( ls_coeff_file_name + stable + 
                                              boost::lexical_cast<std::string>(i) + 
                                              file_name_end , 4 );
        }
    

    【讨论】:

    • 更改了我的代码并得到: 第 43 行:错误:'class boost::shared_ptr<:basic_fstream std::char_traits>> >' has no member named 'open'
    • 你必须使用file_name.c_str()来传递文件名。
    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多