我有一个类,它需要在构造过程中连接两个const char*
字符串,甚至在后面的初始化列表中使用结果(连接的字符串)。
const char* SUFFIX = "suffix";
class widget {
public:
widget(const char* prefix) : key(???), cls(key) { };
private:
const char* key;
const important_class cls;
}
widget("prefix_"); // key should be prefix_suffix
有一个全局(在widget
的cpp中)const char*
后缀,我想将它附加到用户提供的前缀上。
怎么做?
**顺便说一句。**我听说过string
。如果我可以使用string
,我不会在这里问,关于const char*
8条答案
按热度按时间2skhul331#
使用
std::string
使您的问题成为一项微不足道的任务:如果你需要
const char*
,你仍然可以通过调用key.c_str()
来得到它,它返回const char*
。所以在你的例子中,它会给予你 c-string"prefix_suffix"
。还要注意,声明的顺序很重要,你已经正确地做到了:
cls
必须在 *key
之后声明,因为它的构造依赖于key
。k75qkfdt2#
使用
std::string
作为中间值:这里与您的代码唯一不同的是私有成员变量
intermediate
。std::string
对象,intermediate
,管理保存连接所需的动态内存。在发生异常、赋值、复制等情况时,它会很好地清理。只要
string
没有发生突变,c_str()
返回的const char*
就仍然有效。由于intermediate
是const
,因此不能在其上调用任何突变函数,因此使用内部缓冲区的cls
应该不会有问题。6za6bjd03#
你应该使用std::string(或者你的项目使用的任何字符串类)。这会使这更容易,并避免获得异常安全的问题。
如果你坚持
我会用C的方式。
important_class
的构造函数不应该抛出异常。如果需要使用结果
key
初始化cls
,请注意保持声明的顺序。31moq8wy4#
最好使用
std::string
将字符串放在一起。如果需要,您仍然可以调用std::string::c_str()
来获取const char*
。std::string::append
也将const char*
作为参数。或者使用+
-operator。参见here。
nhn9ugyo5#
我不确定你能在初始化列表中做到这一点。当然,其他一些有更多经验的用户可以帮助你......当然,这听起来很明显,但是你可以使用std::string,然后执行以下命令:
当然,你可以这样做:
我错过了整个“important_class”部分。它在这里代表什么?。你想达到什么目的?。
希望能帮上忙。
vlju58qv6#
我看到了两个选项,这取决于您对值持久性等的需求。
第一,将
key
存储为std::string
:第二,使用一个静态初始化函数,类似这样:
jhkqcmku7#
乍一看,你的问题看起来像一个理论测验,但后来我想起可能有一个没有STL的嵌入式平台。
无论如何,你需要坚持使用老式的C风格函数:strlen、strcpy和strcat。
因为你使用的是类,我假设你的编译器也支持new运算符。在我写最后的代码之前,这里是你需要执行的连接字符串的步骤:
幸运的是,strcpy和strcat都返回了目的地。
下面是你的代码可能看起来的样子:
我没有调试这段代码,但它编译得很好,虽然看起来很混乱...:)
不要忘记释放析构函数中的缓冲区。
祝你好运!
lawou6xi8#
如果你不是
std::string
的粉丝,你仍然可以使用c风格的char*
builder自定义函数,并在构造函数中调用builder。在下面的示例中,父类
std::runtime_error(const char*)
已从其子类成功初始化,你可以在孩子和父母之间发现任何错误:
num::dividebyzero_error
std::runtime_error
std::exception
在任何情况下,err.what()都能正确显示字符串。