2015-01-23 2 views
-3

после сбоя приложения после его запуска, PLS Help!C++! доступ к классу с помощью указателя

этот заголовок файла, который я делаю вектор, который содержит 2 значения являются X и Y. Vector2D.h:

#ifndef VECTOR2D_H 
#define VECTOR2D_H 

class Vector2D 
{ 
public: 
    Vector2D(float x , float y):object_x(x) , object_y(y) {} 
    float getX() {return object_x;} 
    float getY() {return object_y;} 
    void setX(float x) {object_x = x;} 
    void setY(float y) {object_y = y;} 

    private: 
    float object_x; 
    float object_y; 
}; 
#endif 

Это заголовочный файл Я объявляю указатель для доступа вектор OMH.h

#include "Vector2D.h" 
#include <iostream> 
#ifndef OMH_H 
#define OMH_H 
using namespace std; 
class OMH 
{ 
public: 
    OMH(); 
    ~OMH(void); 
    void display(); 
    Vector2D *getMouse() 
    {return mouse;} 
private: 
    int x; 
    Vector2D *mouse; 
}; 
#endif 

OMH.cpp

OMH::OMH() 
{ 
} 


OMH::~OMH(void) 
{ 
} 
void OMH::display() 
{ 
    mouse->setX(5); 
    mouse->setY(1); 
    cout<<mouse->getX(); 

} 

, когда я строю, он сменил

main.cpp

#include <iostream> 
#include "OMH.h" 
#include "Vector2D.h" 
using namespace std; 

int main() 
{ 

    OMH * object; 
    object->getMouse(); 
    return 0; 
} 

Когда я бегу, он показал мне окно ошибки, которые говорят: «Объект используется withou intilized» затем он разбился.

+1

'OMH * object;' - неинициализированный указатель, а его использование не определено, но почти наверняка будет аварийно. В этом случае вам не нужен указатель (но должен 'new' /' free', если вы считаете, что вам действительно нужен он). – crashmstr

+1

Вы никогда не назначаете ничего «мыши». – dlf

+0

Кроме того, почему вы делаете 'OMH :: ~ OMH (void)' в C++? 'OMH :: ~ OMH()' достаточно. – HolyBlackCat

ответ

2

Указатель - это переменная, которая может хранить адрес в памяти. Вы должны фактически создать экземпляр OMH:

OMH *object = new OMH; 
// Do stuff 
delete object; 

Хотя, скорее всего, вы не будете делать не нужен указатель в конце концов, и может просто использовать автоматическую переменную вместо:

OMH object; 
object.getMouse(); 
+0

Я пробовал OMH * object = new OMH; он не вызывает сбой, но он не распечатывает даже объект-> getMouse(); что у меня есть функция для печати – Feint13

+0

@ Feint13 У вас такая же ошибка в реализации 'OMH :: getMouse' (неинициализированный указатель). –

+0

это Augen, спасибо, я исправил его, инициализировав его в конструкторе – Feint13

0

Прежде всего,

OMH * object; 

просто объявляет указатель на OMH который не указывает ни на что (это по умолчанию инициализируется). Итак, когда вы делаете

object->getMouse(); 

вы получаете неопределенное поведение (авария в вашем случае).

Вы должны инициализировать указатель

OMH* object = new OMH; // don't forget to delete 

или лучше, использовать смарт-указатель

std::unique_ptr<OMH> object(new OMH); // or use std::make_unique<> in C++14 

Кроме того, в конструкторе OMH::OMH(), вы, вероятно, хотите, чтобы инициализировать указатель mouse, так как теперь он выглядит как mouse не указывает ни на что действующее.

+0

. Я уверен, что он не инициализирован по умолчанию, но будет иметь * неизвестное значение *, что означает, что он указывает на что-то, просто не что-то действительное для использовать. – crashmstr

+0

@crashmstr, что на самом деле означает инициализация по умолчанию. Не то же самое, что инициализация значения. См. Например http://en.cppreference.com/w/cpp/language/default_initialization – vsoftco

3

OMH* object; создает неинициализированный указатель. object не указывает на экземпляр OMH, поэтому, когда вы вызываете getMouse(), вы понесете неопределенное поведение. Использование указателей здесь не требуется, так что вы можете просто создать OMH объект в стеке:

OMH object; 
object.getMouse(); 

У вас есть такая же проблема с OMH::mouse. Это указатель, которому не присвоен действительный блок памяти. Вы должны спросить, действительно ли нужен указатель для этой ситуации.

+0

Кроме того, 'OMH', а не' OMG'. – HolyBlackCat

+0

@HolyBlackCat, хотя OMG - лучшее имя :)) – vsoftco

+0

привет, мне это помогает, но мне действительно нужен указатель здесь, можете ли вы показать мне, как я могу использовать указатель здесь? – Feint13

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