我正在处理一个“家庭作业”问题,但是教授没有解释任何东西,所以我不能提供更多。 直接引用问题:
<块引用>"创建一个打印字符串组合的类。程序应该使用两个构造函数,第一个构造函数应该是一个允许声明字符串数组的空构造函数。第二个构造函数将初始化字符串的长度, 为要存储的字符串分配必要的空间并使用 strcpy 创建字符串本身。您的程序应该由一个连接两个字符串的成员函数组成。它应该估计要连接的字符串的长度,为合并后的字符串分配内存字符串,然后使用 strcpy() 复制字符串并使用 strcat() 连接字符串。"
我无法理解我在这里真正需要做什么。将感谢一些帮助谢谢。 编辑:当我的对象也是字符串数组时,我无法理解如何使用两个构造函数。我在堆上分配吗?有strcpy的替代品吗? VS 建议使用 strcpy_s 代替(这在我的情况下不起作用,所以我使用 #define 语句来忽略不推荐使用的警告)
答案 0 :(得分:0)
据我所知,你有一个我们可以称之为 StringBuilder 的类
这只是帮助您的基本草图。
StringBuilder 有两个构造函数
StringBuilder(char* mystring) // will store myString in an internal buffer
StringBuilder(char* myString, int mystring_len) // will read the length of mystring
// perform allocation and copy the string to new created buffer
和方法
string_join(char* string1, char* string2)
这将分配一个长度为 string1+string2 的缓冲区,并应用 strcat
我想 string_join 可以与构造函数中先前定义的字符串一起使用
我希望这能让你澄清一点,但如果我是你的话,我会问你的老师
答案 1 :(得分:0)
好的,所以您无法理解所有要求。
我不是你的老师,所以我只能告诉你我从你的帖子中了解到的。
<块引用>第一个构造函数应该是一个允许声明字符串数组的空构造函数
创建一个空的(也称为默认)构造函数是很常见的,因为一旦您想要创建该类的对象数组,就需要它。初始化可以推迟到另一个方法的调用,或者将对象设置为默认状态。 让我们继续
<块引用>第二个构造函数将初始化字符串的长度,为要存储的字符串分配必要的空间并使用 strcpy 创建字符串本身
好的,这是构建初始化(立即可用)对象的普通构造函数。顺便说一句,您的老师要求您使用 C 字符串和 C 函数,以及原始分配。稍后您将了解到现代 C++ 避免了这种情况。
构造函数中的这种二元性在 C++ 中很常见。例如,在 ifstream
中有一个默认构造函数,需要稍后使用 open
方法进行初始化,以及一个(完整)构造函数,将文件名作为参数并立即打开它。或者类 std::string
作为默认构造函数,它创建一个空字符串,另一个接受 char
数组并从中初始化字符串。
更进一步:
<块引用>你的程序应该包含一个连接两个字符串的成员函数。
好的,现在更清楚了。您需要执行以下操作
class Xxx {
public:
// default ctor, initialize an empty string
Xxx();
// normal ctor, initialize the string
Xxx(const char *src);
// the main method what will add characters to our string to get our_src + src
y concat(const char *src);
};
备注:
Xxx
更好的名称 - 毫无疑问,您可以找到一个 :-)concat
返回 y
。最常见的用法是不返回任何内容 (void
)、对象本身或对其的 const 引用。这取决于预期如何使用该方法。在不知道更多的情况下,更简单的方法可能是返回 void
根据您最后的问题,我假设您的老师希望您使用 malloc
和 free
或 new[]
和 delete[]
来分配字符数组。这称为动态分配。使用堆只是它的一种可能实现。
strcpy
是标准 C++ 库中包含的标准 C 库的函数。它需要在任何环境中可用(即使 MSVC 需要特殊的编译选项)。 strcopy_s
只是 Microsoft 的扩展。它已添加到标准中,但仅作为可选功能。如果您使用不同的编译器,它可能不可用。所以除非你的老师有不同的说法,否则我的建议是坚持strcpy
。