我有以下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 ++代码。谁能解释一下?
答案 0 :(得分:2)
C++
提供std::string
这是一个可变字符串。无需创建自己的类或使用char数组。您可以在类中包含teh std :: string,以指定您自己的接口。 std::string
自动在堆上分配内存。
替换开始:
char chars[200];
int size;
与
std::string chars;
如果您想自己完成所有分配,而不是使用std::string
或std::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';
}
// ...
};