如何使用与C兼容的库和API管理C ++原则

Ojs*_*Ojs 0 c c++

我是C ++的新手,目前正在从事某些项目,并希望使用C ++而不是C。

我遇到的第一个问题是,例如在OpenSSL中,有接受char*参数的函数。

在C ++中,使用不是一个好主意char*。我读过有人建议std::stringstd::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

Lig*_*ica 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那里,现在仍然没有一个。

  • 换句话说,`std :: string`或`std :: vector` _已经是您描述的类! (3认同)
  • 不用了 只需使用静态constexpr size_t bufSize = 1024; char buf [bufSize] = {};`然后使用`buf`和`bufSize`。而且,如果您需要动态分配,则可以使用`std :: string`或`std :: vector`。我相信您是在想太多。 (2认同)