2016-03-07 67 views
-3

每次使用C++程序时,我都记得所有可能被发明用来吃米饭的器具的模因,“两根棍子是如何赢得的”。 所以让我解释一下这个问题。我想要创建一个类字符串,这些字符串的行为完全是视觉基本的字符串。C++的字符串

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; 
    } 

}; 

所以这是所有... 创作者功能允许类似VB的decleration:

kstring s="Hello World"; 

其他的事情是有点怪; 让我们尝试用一个printf():

printf("%s\n",s); //I prefear printf as cout because more redeable 

它的工作原理只有在私人“的char *值”得到声明为首位。当然s是一个指针,没有人知道在什么时候。所以编译器(代码块),幸运的是将它读为char数组。但是我不知道这是否会在每个编译器和环境中完成,如果在实践中是正确的,如果有更好的方法来定义它,比如vb指令“Default”。 二时会被分配=

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

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

在调试的功能里面,它结合正是“再试一次”,但printf的只显示地址,所以我的任务功能不起作用;有人建议做一个简单的课程来处理字符串?

+8

你为什么不使用[std :: string](http://en.cppreference。com/w/cpp/string/basic_string)从标准库? –

+0

对于赋值,您必须以'const char *'作为参数来实现[赋值运算符](https://en.wikipedia.org/wiki/Assignment_operator_(C%2B%2B))。但是'std :: string'是“标准字符串”,对大多数情况来说已经够用了。在printf中使用's.c_str()'。一旦你采纳了一个新的想法,它很容易使用它。 – Dialecticus

+0

可能有帮助:[printf和自定义类](http://stackoverflow.com/q/12069623/2372759) – MagunRa

回答

2

我推荐学习使用std::string。它并不完美(实际上它有很多缺陷),但它别人正在使用的东西,它已被写入。

与任何C++类一样,您需要担心内存管理。也就是说,类是否拥有它传递的指针,还是只是假定指向内存的指针会超过指向它的对象。我强烈建议班级应该拥有指针。

所以构造将需要变成:

kstring::kstring(const char* c) 
{ 
    const auto len = strlen(c); 
    value = new char[len+1]; 
    strcpy(value,len); 
} 

赋值操作符也需要一个类似的变化。现在你需要编写一个析构函数(释放内存)和一个拷贝构造函数(创建拷贝)。你也应该添加一个移动构造函数和一个移动赋值操作符。你可以通过假设内存总是超过课程来节省所有这些复杂性 - 但是a)我不明白你是如何编写的,b)它使得你的调用者变得更加困难。

operator +应该是一个外部函数(有两个参数),可能需要成为该类的一个朋友(但不必如果您将operator +=作为成员编写)。

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

您还应该认真考虑允许一个len函数和索引。

+0

我不明白为什么OP将不得不担心内存管理,如果字符串只是指向一个字符串文字。 – juanchopanza

+0

这是能够假设指针超出类的一个例子(或者更准确地说,指向内存超过引用内存的对象)。然而,这对于运营商+' –

+0

抱歉不会是真的。我错过了'operator +'。这改变了一切。 – juanchopanza