我是新的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]
的内容,并在析构函数中释放内存。这是解决这种情况的最好办法吗?
或者当我不知道数据大小时,我应该把从socket接收到的数据放在哪里?在C语言中,我会使用recv
分配内存并将其写在那里。但是我如何在“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]
,现在仍然没有。
关于c++ - 如何使用与C兼容的库和API管理C++原则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56277703/