2011-03-16 88 views
1

我想重新学习C++,并想知道是否有人可以帮我在这里。我试图实现我自己的String类来查看我是否可以记住事情,但我被卡在构造函数中。C++:如何实现自己的String类?

我有我的头文件,并希望有一个构造函数这样:

头文件(MYFILES \ STRING.H):

#ifndef STRING_ 
#define STRING_ 

using namespace std; 
#include <iostream> 

class String 
{ 
    private: 

    static const unsigned int MAX = 32; // Capacity of string 

    char Mem[MAX]; // Memory to hold characters in string 
    unsigned Len;  // Number of characters in string 

    public: 

    // Construct empty string 
    // 
    String() 
    { 
     Len = 0; 
    } 

    // Reset string to empty 
    // 
    void reset() 
    { 
     Len = 0; 
    } 

    // Return status information 
    // 
    bool empty() const 
    { 
     return Len == 0; 
    } 

    unsigned length() const 
    { 
     return Len; 
    } 

    // Return reference to element I 
    // 
    char& operator[](unsigned I) 
    { 
     return Mem[I]; 
    } 

    // Return constant reference to element I 
    // 
    const char& operator[](unsigned I) const 
    { 
     return Mem[I]; 
    } 

    // Construct string by copying existing string 
    // 
    String(const String&); 

    // Construct string by copying array of characters 
    // 
    String(const char []); 

    // Copy string to the current string 
    // 
    String& operator=(const String&); 

    // Append string to the current string 
    // 
    String& operator+=(const String&); 
}; 

// Compare two strings 
// 
bool operator==(const String&, const String&); 
bool operator!=(const String&, const String&); 

// Put a string into an output stream 
// 
ostream& operator<<(ostream&, const String&); 

#endif 

我卡上的位是这样的:

String::String(const String& str) 
{ 
    //what goes here? 
} 

谢谢!

+5

世界真的是没有另一个字符串类更好... – 2011-03-16 23:21:27

+6

@Kornel:演习的重点是学习,而不是取代的std :: string。 – 2011-03-16 23:24:30

回答

2

那么,因为它是一个学习练习。

我想你想拷贝另一个字符串的内容,因为这是一个拷贝构造函数。所以你会想复制所有的成员变量。在你的情况 复制构造函数是没有必要的,因为你有一个静态数组。如果你有 动态内存(即用新分配指向内存的指针),那么你需要这个。然而, 告诉你它是如何完成的,在这里你去。

String::String(const String& str) 
{ 
    //what goes here? 
    assert(str.Len < MAX); // Hope this doesn't happen. 
    memcpy(Mem, str.Mem, str.Len); 
    Len = str.Len; 
} 
+1

我应该澄清,有一个默认复制构造函数定义,默认情况下复制所有成员变量。如果你有动态内存,那么你需要定义一个拷贝构造函数。 – Matt 2011-03-16 23:33:06

+2

+1,这就是我要说的,虽然我会强调一个关键点 - 当默认设置已经做对了的时候,不要实现复制ctor或复制赋值操作符。有一种可能的优化,即只复制'Len'字节可以为短字符串保存一些复制,但32字节是不够的,我不会担心。 – 2011-03-16 23:38:01

1

您需要将str中的数据复制到this。长度很简单:

Len = str.Len; // or, equiv. this->Len= str.Len 

数据有点难。您可能使用strcpymemcpy,或甚至使用for循环。

memcpy(Mem, str.Mem, sizeof Mem); 

祝你好运!

+0

小问题,memcpy复制整个mem数组,包括那些不属于字符串但在数组中的Len以外的数组。 – Matt 2011-03-16 23:36:52

0

我同意Kornel Kisielewicz:手卷字符串类越少越好。但是你只是在学习,所以这么公平:-)。无论如何:你的拷贝构造函数需要拷贝Mem数组的长度和内容,就是这样。 (如果你这样做是为了做一些有用的事情而不是学习练习,我会添加:具有固定的最大字符串长度的字符串类 - 特别是一个小至32个字符的字符串类 - 是非常糟糕的但如果你不想在处理内存分配和释放的同时尝试记住更基本的内存,那么这是完全合理的......)