带C++; 每一次C++程序中,我都会记住“可能是发明出来的用来吃米饭的所有器具的模因”,两个木棍是如何获胜的。 让我来解释一下这个问题。我想创建一个类字符串,该类字符串与visual basic的字符串完全相同 class kstring { char *value; public: kstring(char *val) { value=val; } kstring operator+(kstring *val) { //some code here that works } kstring &operator=(kstring s2) { value=s2.value; return *this; } };

带C++; 每一次C++程序中,我都会记住“可能是发明出来的用来吃米饭的所有器具的模因”,两个木棍是如何获胜的。 让我来解释一下这个问题。我想创建一个类字符串,该类字符串与visual basic的字符串完全相同 class kstring { char *value; public: kstring(char *val) { value=val; } kstring operator+(kstring *val) { //some code here that works } kstring &operator=(kstring s2) { value=s2.value; return *this; } };,c++,string,C++,String,这就是全部。。。 creator函数允许类似于VB的偏差: kstring s="Hello World"; 其他事情只是有点奇怪; 让我们尝试使用printf() 只有将私有“char*值”声明为第一位时,它才起作用。当然,s是一个指针,没有人知道它指向什么点。因此,编译器(代码块)幸运地将其读取为字符数组。但我不知道每个编译器和环境是否都能做到这一点,在实践中是否正确,是否有更好的方法来定义它,比如vb指令“Default”。 第二,当你被指派的时候= kstring s,s2; s

这就是全部。。。 creator函数允许类似于VB的偏差:

 kstring s="Hello World";
其他事情只是有点奇怪; 让我们尝试使用printf()

只有将私有“char*值”声明为第一位时,它才起作用。当然,s是一个指针,没有人知道它指向什么点。因此,编译器(代码块)幸运地将其读取为字符数组。但我不知道每个编译器和环境是否都能做到这一点,在实践中是否正确,是否有更好的方法来定义它,比如vb指令“Default”。 第二,当你被指派的时候=

 kstring s,s2;
 s="try ";
 s2="again";
 s=s+s2;

 printf("%s\n",s);

在debug中的函数内部,它完全结合了“重试”,但printf只显示地址,因此我的赋值函数不起作用;有人建议学习一门处理字符串的简单课程?

我建议学习使用
std::string
。它不是完美的(事实上它有很多缺陷),但它是其他人都在使用的,而且它已经被编写出来了

与任何C++类一样,您需要担心内存管理。也就是说,类是否拥有它所传递的指针,或者它只是假设指向它的内存将比引用它的对象更长寿。我强烈建议类应该拥有指针

因此,建造商需要:

kstring::kstring(const char* c)
{
    const auto len = strlen(c);
    value = new char[len+1];
    strcpy(value,len);
}
赋值运算符也需要进行类似的更改。现在需要编写析构函数(释放内存)和副本构造函数(创建副本)。您可能还应该添加移动构造函数和移动赋值运算符。通过假设内存总是比类长,可以节省所有这些复杂性,但是a)我不知道如何编写
operator+
,b)这会让调用方更加困难

operator+
应该是一个外部函数(有两个参数),它可能需要是类的朋友(但如果您以成员身份编写
operator+=
,则不需要)

不能将类对象传递给
printf
。对不起,这只是未定义的行为。你很幸运有了你的编译器。因此,您需要定义一个函数,将
kstring
转换回
const char*
std::string
版本称为
c_str()
——您可以使用该名称或其他名称


你也应该认真考虑允许<代码> Le<代码>函数和索引。

为什么不使用标准库?对于赋值,你必须以<代码> const char */COD>作为参数来实现。但是
std::string
是“标准字符串”,对于大多数情况来说已经足够好了。在printf中使用
s.c_str()
。一旦你采纳了一个新的想法,它就很容易使用。可能会有帮助:“当然,
s
是指针”不,它不是。它是一个
kstring
。无论如何,请使用
std::cout
并重载相应的运算符。关于如何做到这一点,有很多帖子。这个
kstring
类就是一根棍子。吃米饭没什么用。我不明白,如果字符串只是指向字符串文字,OP为什么要担心内存管理。这是一个能够假设指针比类活得长的例子(或者更准确地说,指向的内存比引用内存的对象活得长)。但是,对于
操作员+
道歉来说,情况并非如此。我错过了
操作员+
。这改变了一切,正是我需要阅读的。让我使用C/C++的正是字符串。我非常需要它们,用于编写查询sql、保存数据等等。我需要的是在代码中包含一个绝对标准的类。所以,如果我使用std库,它必须是标准的,如stdio.h或stdlib.h,每个c编译器都有。我试了很多,cstring,string,string.h,但我不知道我必须包括哪些。你告诉我#include将在每一个编译器中都起作用?
#include
将起作用-但它将包括C标准库函数(
strcpy
等)。您需要的是
#包括
。它在FORTRAN编译器中不起作用,但它在过去20年中使用的每个C++编译器中都起作用,如果它不起作用,它不是按照国际标准的C++编译器。
kstring::kstring(const char* c)
{
    const auto len = strlen(c);
    value = new char[len+1];
    strcpy(value,len);
}