Newb C ++ Class Проблема - PullRequest
       41

Newb C ++ Class Проблема

1 голос
/ 19 декабря 2009

Я пытаюсь понять указатели и их удивительность, а также лучшее понимание C ++.Я не знаю, почему это не скомпилируется.Пожалуйста, скажите мне, что не так?Я пытаюсь инициализировать указатель при создании экземпляра класса.Если я попробую с обычным int, он будет работать нормально, но когда я попытался установить его с помощью указателя, я получу это в консоли

Running…

Конструктор с именем

Программа получила сигнал: «EXC_BAD_ACCESS».

sharedlibrary apply-load-rules all

Любая помощь очень ценится.

Вот код

#include <iostream> 
using namespace std;
class Agents
{
public:
    Agents();
    ~Agents();
    int getTenure();
    void setTenure(int tenure);
private:
    int * itsTenure;
};
Agents::Agents()
{
    cout << "Constructor called \n";
    *itsTenure = 0;
}
Agents::~Agents()
{
    cout << "Destructor called \n";
}
int Agents::getTenure()
{
    return *itsTenure;
}
void Agents::setTenure(int tenure)
{
    *itsTenure = tenure;
}
int main()
{
    Agents wilson;
    cout << "This employees been here " << wilson.getTenure() << " years.\n";
    wilson.setTenure(5);
    cout << "My mistake they have been here " << wilson.getTenure() <<
             " years. Yep the class worked with pointers.\n";
    return 0;
}

Ответы [ 5 ]

10 голосов
/ 19 декабря 2009

Вы никогда не создаете int, на которое указывает указатель, поэтому указатель является указателем на область памяти, которая не существует (или используется для чего-то другого).

Вы можете использовать new, чтобы получить блок памяти из кучи, new возвращает адрес ячейки памяти.

itsTenure = new int;

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

Изменен конструктор следующим образом:

Agents::Agents()
{
    cout << "Constructor called \n";
    itsTenure = new int;
    *itsTenure = 0;
}

Но вы также должны помнить, чтобы удалить его, используя delete

Agents::~Agents()
{
    cout << "Destructor called \n";
    delete itsTenure;
}
4 голосов
/ 19 декабря 2009

Вы просто пропустили новое в конструкторе.

 itsTenure = new int;

Однако вам не нужно указывать это. Почему ты?

3 голосов
/ 19 декабря 2009

*itsTenure = 0 не инициализирует указатель. Он записывает 0 в местоположение, на которое указывает его свойство. Так как вы никогда не указывали, на что указывает itsTenure, это может быть где угодно, и поведение не определено (нарушение прав доступа, как будто вы получаете наиболее вероятный результат).

3 голосов
/ 19 декабря 2009

Вы должны выделить блок памяти для вашего int, и только затем использовать адрес этого блока памяти (указатель). Это делается с помощью new:

cout << "Destructor called \n";   
itsTenure = new int;    
*itsTenure = 0;

Затем вы должны освободить память в деструкторе с помощью delete:

    cout << "Destructor called \n";
    delete itsTenur;
1 голос
/ 19 декабря 2009

Вам нужно выделить память для * владения в конструкторе:

Agents::Agents()
{
    cout << "Constructor called \n";
    itsTenure = new int;
    *itsTenure = 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...