2010-09-14 105 views
0

下面的代码不起作用:问题指针和构造

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; 
    }; 

你可以请建议为什么吗?

谢谢,李。

+2

您应该说明它是什么,你考虑没有工作,它是什么,你认为现在可能工作对你想要达到的目标给出理性。对于初学者来说,你应该使用'std :: string',因为它已经工作了,从那里开始......你提供泄漏内存的两个实现,计数器不需要动态分配,通常是一个好主意成员暴露... – 2010-09-14 14:31:50

+0

你为什么要调用默认的构造函数,看起来没有附加值? – 2010-09-14 14:32:36

回答

3

“不起作用”不是一个很好的问题描述。但你显然试图从另一个构造函数调用。这就是所谓的构造函数的委托,并没有(尚未)被C++支持。

顺便说一句,这样的类应该得到一个用户定义的副本构造函数,赋值运算符和析构函数。

+0

+1:用于复制ctor,赋值和析构函数 – 2010-09-14 14:43:04

2

在当前的C++中,构造函数不能相互调用。这就是所谓的“链接构造函数”,或者“委托构造函数”,并且由新的C++ 0x标准支持,但使用的语法与您正在使用的不同。

题外话,你为什么使用int指针指向计数器?

2

在我看来,你正试图从同一个类的另一个构造函数调用构造函数,就像你在C#中一样。不幸的是,你不能在C++中做到这一点(至少我没有简单的方法)。您需要有一个私有方法或复制代码。

0
  • 为什么计数器是一个指针?

什么不行?编译错误?

大概在另一个内部调用构造函数在你的编译器中不被很好的支持?

什么平台?

1

调用字符串();实际上会创建一个临时对象,然后再将其扔掉。它不会调用其他构造函数。

1

调用'String();'将创建一个立即销毁的String类型的未命名临时对象。第二个代码片段很好。

然而,你应该真的重新看你的班级成员。使用std :: string而不是原始字符指针。此外int *counter看起来不是很直观

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); 
    }; 


};