Java到C ++的翻译

时间:2014-07-13 08:34:12

标签: java c++

我有以下Java代码:

class MutableString{ 
     private char[] chars = new char[200]; 
     private int size = 0; 
     public boolean set(char aChar, int index){ 
         if (index < 0 || index >= chars.length) 
         return false; 
         chars[index] = aChar; 
         return true; 
      } 
     public String toString(){ 
         String result = ""; 
         for (int i = 0; i < size; i++) 
         result += chars[i]; 
         return result; 
      } 
} 

我想将其转换为C ++代码,数组应该是一个静态动态变量。这是我的C ++代码:

class MutableString{
    public:
    bool set(char aChar, int index){
        if (index < 0 || index >= sizeof(chars))
        {
            return false;
        } else {
            chars[index] = aChar;
            return true;
        }
    }
    string toString(){ 
        string result = ""; 
        for (int i = 0; i < size; i++) 
        result += chars[i]; 
        return result; 
    } 

    private:
        char chars[200];
        int size; 
}
你可以告诉我我做错了什么吗?如果我想要数组一个堆动态变量。如何修改代码?我不太清楚静态动态和堆动态变量的C ++代码。谁能解释一下?

2 个答案:

答案 0 :(得分:2)

C++提供std::string这是一个可变字符串。无需创建自己的类或使用char数组。您可以在类中包含teh std :: string,以指定您自己的接口。 std::string自动在堆上分配内存。

替换开始:

char chars[200];
int size;

std::string chars;

如果您想自己完成所有分配,而不是使用std::stringstd::vector,则需要在构造函数中分配内存并在析构函数中将其删除。您还需要添加复制构造函数和赋值运算符,添加大量额外代码。

class MutableString{

    public:
    MutableString() : chars( new char[200] ), size( 0 ) {}
    ~MutableString(){ delete[] chars; }
    MutableString( const MutableString & other ) : chars( new char[200] ), size( other.size )
    {
        std::copy( other.chars, other.chars + 200, chars );
    }

    MutableString & operator=( const MutableString & other )
    {
        std::copy( other.chars, other.chars + 200, chars );
        return *this;
    }

    private:
        char * chars;
        int size; 
}

(注意:您的代码永远不会设置大小的值,您需要初始化它。)

但是你不能轻易地调整它,它总是需要200个字节,因此在这种情况下使用std::string会更容易,更有效。编译器负责分配和复制构造函数,自动生成它。

答案 1 :(得分:1)

由于目前还不清楚您想要实现什么目标,目前尚不清楚最佳解决方案的外观。当你问为什么你的代码崩溃时:你没有初始化size。所以它会有一个随机值。

(顺便说一句,您的Java代码不会崩溃;但是,您也不会在任何地方设置大小。)

您必须在C ++类中添加一个构造函数,将size初始化为0:

class MutableString {
   public:
      MutableString () : size (0) {
         // you might want to fill chars with zeros,
         // which is done automatically in Java
         // note that sizeof will give the wrong result if chars
         // is not an array of char
         // better: std::fill (begin (chars), end (chars), '\0');
         for (size_t i = 0; i < sizeof(chars); ++i) chars[i] = '\0';
      }

   // ...
};