以下代码不起作用:
class String{
public:
char* str;
int* counter;
String(){
str = NULL;
counter = new int;
*counter = 1;
};
String(const char* str1){
String();
str = new char[strlen(str1)+1];
strcpy(str, str1);
};
};
我已经将调用更改为空构造函数并将其替换为内部构件,现在以下代码可以正常工作:
class String{
public:
char* str;
int* counter;
String(){
str = NULL;
counter = new int;
*counter = 1;
};
String(const char* str1){
//String();
str = new char[strlen(str1)+1];
strcpy(str, str1);
counter = new int;
*counter = 1;
};
你能告诉我为什么吗?
谢谢,李。
答案 0 :(得分:3)
“不起作用”不是对问题的良好描述。但是你显然试图从另一个构造函数中调用它。这称为构造函数委托,而C ++尚未支持。
BTW,像这样的类应该得到一个用户定义的拷贝构造函数,赋值运算符和析构函数。答案 1 :(得分:2)
在当前的C ++中,构造函数不能相互调用。这被称为“链接构造函数”或“委托构造函数”,并且受新C ++ 0x标准支持,但语法与您使用的语法不同。
偏离主题,为什么要为计数器使用int指针?
答案 2 :(得分:2)
在我看来,你试图从同一个类的另一个构造函数中调用构造函数,就像你在C#中那样。不幸的是你不能用C ++做到这一点(至少我不知道这么简单)。您需要拥有私有方法或复制代码。
答案 3 :(得分:1)
调用String();实际上创建一个临时对象,然后再将其抛弃。它不会调用其他构造函数。
答案 4 :(得分:1)
调用'String();'
创建一个类型为String
的未命名临时对象,该对象会立即销毁。第二个代码片段很好。
但是你应该真正重新审视你班上的成员。使用std :: string而不是raw char指针。此外int *counter
看起来不太直观
答案 5 :(得分:1)
您可以这样做:
class String{
public:
char* str;
int* counter;
private:
void initialize() {
str = NULL;
counter = new int;
*counter = 1;
}
public:
String(){
initialize();
};
String(const char* str1){
initialize();
str = new char[strlen(str1)+1];
strcpy(str, str1);
};
};
答案 6 :(得分:0)
什么不起作用?编译错误?
你的编译器可能不支持在另一个内部调用构造函数吗?
什么平台?