C ++!通过指针访问classess

时间:2015-01-23 16:22:15

标签: c++ class pointers

应用程序在运行后崩溃,请帮忙!

我创建一个包含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;
}

当我运行它时,它会显示一个错误框,上面写着:&#34;正在使用的对象被使用!&#34; 然后就崩溃了。

3 个答案:

答案 0 :(得分:3)

OMH* object;创建未初始化的指针object并未指向OMH个实例,因此当您致电getMouse()时,您将产生未定义的行为。这里不需要使用指针,因此您只需在堆栈中创建一个OMH对象:

OMH object;
object.getMouse();

OMH::mouse存在同样的问题。它是一个没有指向有效内存块的指针。您应该质疑该情况是否确实需要指针。

答案 1 :(得分:2)

指针只是一个可以在内存中存储地址的变量。您需要实际创建OMH的实例:

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

尽管很可能,你毕竟不需要指针,而只能使用自动变量:

OMH object;   
object.getMouse();

答案 2 :(得分: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没有指向任何有效的内容。