我是C ++的新手,目前正在从事某个项目,并且希望使用C ++而不是C。
我遇到的第一个问题是,例如在OpenSSL中,有一些函数接受char*
作为参数。
在C ++中,使用char*
不是一个好主意。我了解到有人建议改用std::string
或std::vector<char>
。
但是例如OpenSSL中的BIO_read
(将数据写入char*
)功能接受char*
。 std::string
具有函数c_str()
,但返回const char*
。我知道我可以使用const
进行const_cast
强制转换,但这不是一个好主意,因为这不是应该更改字符串的方式。
此问题的“ C ++解决方案”是什么?我想同时使用RAII和OOP原则。我唯一想到的解决方案是创建一个类,该类将在构造函数中接受内存大小作为参数,并具有类似char* _buf = new char[size]
的内容,并在析构函数中释放内存。这是解决这种情况的最佳解决方案吗?
或者当我不知道大小时,应该使用recv
从套接字接收的数据放在哪里?在C语言中,我将使用malloc
分配内存并将其写入那里。但是,我该如何以“ C ++风格”做到这一点?创建我上面提到的类并使用它代替malloc
?
答案 0 :(得分:7)
std::string
还具有.data()
,您应将其用于此任务(至少在保证字符串数据连续的现代C ++中)。
除此之外,是的,在使用C API时,您可能必须权衡C ++的最佳实践。这在回调中尤为明显,在没有一些难看的机制的情况下,您无法将捕获的lambda或指向成员函数的指针传递给回调。
一些C库由C ++包装器补充,由原始库的作者或第三方(例如MySQL ++,curlpp)编写-这意味着已经为您完成了丑陋的操作,您不必担心关于它。
您的_buf
解决方案并不可怕,但是一个std::vector<char>
可能会更好,或者一个std::unique_ptr<char[]>
(尽管再次考虑,std::string
可能很适合毕竟是您的需求。
对于recv
,这是另一回事,它与C ++设计原理没有真正的关系。您已经需要考虑到您不知道可以读取多少个字节,因此您已经需要重复读入一个小缓冲区并处理数据。因此,您可以为此继续使用不错的自动存储char buf[1024]
-那里不再需要malloc
,而且现在还没有。