问题描述
我尝试使用以下方法编写字符串构建器模式:
append(string s) // Input a string and add it to the list
reverse() // Input a string and reverse him
toString() // Return the string of all the chars in the list
apply // Given a function it will apply it to all characters
所以前 3 种方法都有效,这就是我的 code
:
class MyStringBuilder {
int size;
char* myString;
public:
// CTOR
MyStringBuilder():size(0) {
myString = new char[size + 1];
}
// DTOR
~MyStringBuilder() {
cout<<"DTOR"<<endl;
if (myString != nullptr) {
delete[] myString;
}
}
int sizeChars(const char* s) {
int count = 0;
while(*s != '\0') {
s++;
count++;
}
return count;
}
MyStringBuilder& append(const char* s) {
int count = sizeChars(s);
char* helper;
helper = new char[size + 1];
strcpy(helper,myString);
myString = new char[size + count + 1];
strcpy(myString,helper);
strcpy(myString + size,s);
size += count;
delete [] helper;
return *this;
}
MyStringBuilder& reverse() {
size = strlen(myString);
for(int i = 0; i < strlen(myString) / 2; i++) {
char temp = myString[i];
myString[i] = myString[strlen(myString) - i - 1];
myString[strlen(myString) - i - 1] = temp;
}
return *this;
}
string toString() {
string s(myString);
return s;
}
};
所以除了 apply 方法之外,一切都在工作,我看到在 java
的主函数中它是这样写的:
String s = sb.append("abc").append("def").reverse().apply(c->(char)(c-('a'-'A'))).toString(); // s=FEDCBA
我们如何在 c++
中编写 apply 方法?以及如何将java
的线函数转换为cpp
?
解决方法
MyStringBuilder& append(char (*op)(char)) {
for (char* c = myString; c < myString + size; c++)
*c = op(*c);
return *this;
}
如果你想接受有状态的 lamdas 然后声明函数
MyStringBuilder& append(std::function<char(char)> op)
或
MyStringBuilder& append(auto op)