【问题标题】:C++ ! access classess via pointer [closed]C++!通过指针访问类[关闭]
【发布时间】:2015-01-23 16:22:15
【问题描述】:

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

我制作一个包含 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;
}

当我运行它时,它会显示一个错误框,上面写着:“正在使用的对象没有被集成!” 然后它崩溃了。

【问题讨论】:

  • OMH * object; 是一个未初始化的指针,它的使用是未定义的,但几乎肯定会崩溃。在这种情况下,您似乎不需要指针(但如果您认为确实需要指针,则应该使用 new/free)。
  • 你也永远不会给mouse分配任何东西。
  • 另外,你为什么在 C++ 中使用OMH::~OMH(void)OMH::~OMH() 就够了。
  • 使用调试器的好案例。调试器可以帮助您一次执行一条语句并查看变量的值。比要求 StackOverflow 执行代码检查要快得多。

标签: c++ class pointers


【解决方案1】:

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

OMH object;
object.getMouse();

OMH::mouse 也有同样的问题。它是一个没有给定有效内存块指向的指针。您应该质疑这种情况是否真的需要指针。

【讨论】:

  • 另外,OMH,而不是 OMG
  • @HolyBlackCat 虽然 OMG 是一个更好的名字 :))
  • 嗨,它确实对我有帮助,但我真的需要一个指针,你能告诉我如何在这里使用指针吗?
【解决方案2】:

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

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

虽然很可能,您毕竟不需要指针,而可以使用自动变量:

OMH object;   
object.getMouse();

【讨论】:

  • 我试过 OMH * object = new OMH ;它不会导致崩溃,但它甚至不会打印出 object->getMouse();我有打印的功能
  • @Feint13 你在OMH::getMouse(未初始化的指针)的实现中有同样的bug。
  • it Augen,谢谢,我通过在构造函数中初始化它来修复它
【解决方案3】:

首先,

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 没有指向任何有效的东西。

【讨论】:

  • 我很确定它不是默认初始化的,但会有一个 unknown value,这意味着它确实指向了某些东西,只是不是可以使用的东西。
  • @crashmstr 这就是默认初始化的实际含义。与值初始化不同。参见例如en.cppreference.com/w/cpp/language/default_initialization
猜你喜欢
  • 2019-11-26
  • 2018-07-04
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多