2016-02-01 3 views
0

Я получаю странную ошибку времени выполнения, которую я просто не могу понять. Делаю объект моего класса Circle, который имеет следующий конструктор по умолчанию:Создание объекта внутри другого класса C++

Circle::Circle() 
{ 
    this->radius = 0; 
    this->center->setX(0); 
    this->center->setY(0); 
} 

Переменные, которые будучи инициализируются являются:

private: 
    double radius; 
    Point *center; 
}; 

Когда я пытаюсь создать объект класс круга, я получаю ошибку времени выполнения. Теперь я получаю эту ошибку только тогда, когда объект Object object объявлен динамически. Что-то не так с моим синтаксисом? Когда я объявляю точку в моем классе Circle, как это вместо:

Point center; 

И инициализирует его, как это вместо:

Circle::Circle() 
{ 
    this->radius = 0; 
    this->center.setX(0); 
    this->center.setY(0); 
} 

Он работает. Почему я получаю эти ошибки при создании объекта динамически? Могу ли я использовать два «->», как в первом примере?

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

+0

Какие ошибки? И где вы создали «Точку»? –

ответ

1

Вы должны лучше использовать

Circle { 
private: 
    double radius; 
    Point center; // <<<<<<< No pointer here 
}; 

Вы не требуется указатель.

Проблема с вашим текущим кодом заключается в том, что для вашей переменной указателя не выделяется память. Я также не рекомендую это делать (например, с помощью center = new Point()). Как уже упоминалось, это необязательно.

Также вам не нужен this-> для доступа к членам класса. Просто используйте список инициализаторов членов в вашем конструкторе:

Circle::Circle() : radius(0), center(0,0) { 
} 
0

center - указатель. Если вы не выделяете для него какую-либо память, вы не можете получить к ней доступ, поскольку она не указывает на действительный объект. Чтобы получить действительный объект, мы использовали бы

Circle::Circle() : radius(0), center(new Point) 
{ 
    center->setX(0); 
    center->setY(0); 
} 

Если Point имеет конструктор, который принимает x и y, то вы можете даже использовать

Circle::Circle() : radius(0), center(new Point(0, 0)) {} 

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

Circle::Circle() : radius(0), 
{ 
    center.setX(0); 
    center.setY(0); 
} 
// or 
Circle::Circle() : radius(0), center(0, 0) {} 
0

Проблема возникает потому, что center является указателем, который не имеет памяти, выделенной для него. Поскольку ни один такой объект не существует,

Circle::Circle() 
{ 
    this->radius = 0; 
    this->center = new Point; //call the appropriate Point constructor 
    this->center->setX(0); //now these are valid 
    this->center->setY(0); 
} 

также заметить, так как center это указатель на вашем implementaion, center.setX(0) недействителен, вы должны сделать center->setX(0) вместо

+0

Они недействительны.Если вы хотите получить доступ к элементу указателя, вы должны использовать -> и не. – LugaidVandroiy

+0

Это был небольшой вид, который я только что поймал. – ForeverStudent

Смежные вопросы