我是 C++ 的新手,目前我正在做一些项目,想使用 C++ 而不是 C。
我遇到的第一个问题是,例如在 OpenSSL 中有接受 char*
的函数。作为参数。
在 C++ 中使用 char*
不是一个好主意.我读到有人推荐 std::string
或 std::vector<char>
相反。
但是例如BIO_read
(将数据写入 char*
)OpenSSL 中的函数接受 char*
. std::string
具有功能c_str()
但它返回 const char*
.我知道我可以投 const
使用 const_cast
但这不是一个好主意,因为这不是更改字符串的方式。
这个问题的“C++ 解决方案”是什么?我想同时使用 RAII 和 OOP 原则。我能想到的唯一解决方案是创建一个类,该类将接受内存大小作为构造函数中的参数,并具有类似 char* _buf = new char[size]
的内容。并在析构函数中释放内存。这是解决这种情况的最佳方案吗?
或者我应该把使用 recv
从套接字接收到的数据放在哪里?当我不知道尺码时?在 C 中,我会使用 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
那里,现在还没有。
关于c++ - 如何使用 C 兼容库和 API 管理 C++ 原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56277703/