проблема с указателями и конструкторами - PullRequest
0 голосов
/ 14 сентября 2010

Следующий код не работает:

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 ]

3 голосов
/ 14 сентября 2010

«Не работает» не является хорошим описанием проблемы. Но вы, очевидно, пытались вызвать конструктор из другого. Это называется делегированием конструктора и не поддерживается (пока) в C ++.

Кстати, такой класс должен получить пользовательский конструктор копирования, оператор присваивания и деструктор.

2 голосов
/ 14 сентября 2010

Мне кажется, вы пытаетесь вызвать конструктор из другого конструктора того же класса, как, например, в C #.К сожалению, вы не можете сделать это в C ++ (по крайней мере, не так просто, как я знаю).Вам нужно либо использовать приватный метод, либо дублировать код.

2 голосов
/ 14 сентября 2010

В текущем C ++ конструкторы не могут вызывать друг друга. Это называется «конструкторы цепочки» или «делегирующие конструкторы» и поддерживается новым стандартом C ++ 0x, но с синтаксисом, отличным от используемого вами.

Не по теме, почему вы используете указатель на int для счетчика?

1 голос
/ 14 сентября 2010

Вам разрешено делать что-то вроде этого:

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


 };
1 голос
/ 14 сентября 2010

Вызов 'String();' создает неназванный временный объект типа String, который немедленно уничтожается. Второй фрагмент кода в порядке.

Однако вы должны по-настоящему взглянуть на членов вашего класса. Используйте std :: string вместо необработанного указателя на символ. Также int *counter выглядит не очень интуитивно

1 голос
/ 14 сентября 2010

Вызывающая строка ();на самом деле создает временный объект, а затем выбрасывает его снова.Он не будет вызывать другой конструктор.

0 голосов
/ 14 сентября 2010
  • почему счетчик является указателем?

Что не работает?ошибка компиляции?

Возможно, вызов конструктора внутри другого не поддерживается вашим компилятором?

какая платформа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...