指针和构造函数的问题

时间:2010-09-14 14:28:04

标签: c++ constructor

以下代码不起作用:

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

你能告诉我为什么吗?

谢谢,李。

7 个答案:

答案 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)

  • 为什么计数器是指针?

什么不起作用?编译错误?

你的编译器可能不支持在另一个内部调用构造函数吗?

什么平台?