我是C ++的新手,目前正在从事某些项目,并希望使用C ++而不是C。
我遇到的第一个问题是,例如在OpenSSL中,有接受char*参数的函数。
在C ++中,使用不是一个好主意char*。我读过有人建议std::string或std::vector<char>代替。
但是例如OpenSSL中的BIO_read(将数据写入char*)函数accepts char*。std::string具有功能,c_str()但返回const char*。我知道我可以const使用const_cast强制转换,但这不是一个好主意,因为这不是应该更改字符串的方式。
这个问题的“ C ++解决方案”是什么?我想同时使用RAII和OOP原则。我唯一想到的解决方案是创建一个类,该类将在构造函数中接受内存大小作为参数,并具有类似这样的内容char* _buf = new char[size]并在析构函数中释放内存。这是针对这种情况的最佳解决方案吗?
还是在我recv不知道大小的情况下应该使用从套接字接收的数据呢?在CI中,将使用分配内存malloc并将其写入那里。但是,我该如何以“ C ++风格”做到这一点?创建我上面提到的类,并使用它代替malloc?
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那里,现在仍然没有一个。