Проблемы с указателями .. (C ++) - PullRequest
0 голосов
/ 18 апреля 2009

Как только я подумал, что понял, я получил ошибку обработки исключений. Проблема: проблема в том, что частные члены теряют информацию вне конструктора. Вот мое определение класса

Код:

class ClassType
{
    private:
             char *cPointer;
             int length;

    public:
            ClassType();
            // default constr. needed when allocating  in main.
            ClassType( const ClassType* );
            char otherFunc();    
};

classtype.cpp:

"#include ClassType.h"

ClassType( const ClassType* )
{
    cPointer = ClassType->cPointer;
    length = ClassType->length;
}

ClassType::ClassType( const char *myVar )
{
    cPointer = new char[ strlen( myVar ) + 1 ]  //+1 for trailing '\0'
    strcpy( cPointer, myVar );
    length = strlen( cPointer );
}

char ClassType::otherFunc()
{
    cPointer;  // Nothing is shown when debugging..
    cPointer = "MyPointer"; // Results in  acrash
    length = 5; // Results in a crash
}

// The main function is working properly.

Ответы [ 5 ]

4 голосов
/ 18 апреля 2009
  1. Это недопустимый код C ++.
  2. Если вы используете C ++, вы не должны использовать std :: string для строки?
  3. Конструктор на основе другого экземпляр должен быть ClassType(const ClassType& rhs)
2 голосов
/ 18 апреля 2009

Это настоящий код?

ClassType( const ClassType* )
{
    cPointer = ClassType->cPointer;
    length = ClassType->length;
}

Если так, то должно быть так:

ClassType( const ClassType* rhs )
{
    cPointer = rhs->cPointer;
    length = rhs->length;
}

Кроме того, этот конструктор не является ctor по умолчанию:

ClassType( const ClassType* ); // default constr. needed when allocating  in main.

Ктор по умолчанию - это, в частности, ctor, который либо принимает нулевые параметры, либо для всех параметров заданы значения по умолчанию. Другими словами, ctor по умолчанию - это ctor, который можно вызвать так:

ClassType myObject;
2 голосов
/ 18 апреля 2009

Я не могу понять, почему это может произойти сбой, когда вы указываете, но есть несколько проблем с вашим кодом (некоторые из которых являются проблемами во время компиляции, поэтому мы не можем быть уверены, что этот код точно отражает проблему):

  • существуют проблемы с владением - когда вызывается ClassType::ClassType( const ClassType* ), какой экземпляр ClassType владеет объектом, на который указывает cPointer?
  • нет dtor для освобождения памяти, выделенной в `ClassType :: ClassType (const char * myVar) '
  • , поскольку cPointer может указывать на что-то, выделенное new, а может и нет, у вас возникнут проблемы при попытке определить, когда объект, выделенный new, должен быть удален.

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

  • определение ClassType( const ClassType* ) должно начинаться с ClassType::ClassType( const ClassType* )
  • содержимое ClassType::ClassType( const ClassType* ) должно использовать параметр вместо ClassType имени класса в качестве указателя
  • char ClassType::otherFunc() нужен оператор возврата
1 голос
/ 18 апреля 2009

Я дал довольно полный ответ на ваш другой вопрос об этом коде . Я считаю, что главная проблема в том, что ваш конструктор копий сильно поврежден. Это повлечет за собой двойные бесплатные ошибки и другие неприятности. Кроме того, поскольку ваш деструктор вызывает delete для указателей, которые вы выделяете, вы никогда не сможете назначать строковые литералы указателям классов.

0 голосов
/ 18 апреля 2009

Конструкторы по умолчанию - это те, для которых все аргументы имеют значения по умолчанию, поэтому ваш конструктор, который принимает указатель, не является конструктором по умолчанию.

Ваши места сбоя указывают на то, что класс не был построен должным образом, поэтому вы, вероятно, получаете адресные ошибки при назначении им.

Не могли бы вы опубликовать основной, так как это, вероятно, ключ, чтобы увидеть проблему?

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