【问题标题】:The object a pointer is pointing to changes values every time a get function is called? C++每次调用 get 函数时,指针指向的对象都会更改值? C++
【发布时间】:2020-10-09 05:54:37
【问题描述】:

我有两个课程,一个是燃料课程,另一个是里程课程。每 24 英里使用 1 次燃料。对于这个作业,我需要在我的“miles”类中有一个指向“fuel”类的指针,这样我们就可以让“mile”类与“fuel”类一起工作,而不必创建整个对象“fuel”对象在“英里”类中。在我对其进行测试之前一直进展顺利,经过一些调试后,似乎由于某种原因,每当我在“英里”类中调用 get 函数时,燃料对象的值都会发生变化。但是,我所做的只是返回一个成员变量。为什么它会改变我的燃料对象?我也不会在其他任何地方更改指针的值,因此它应该始终指向燃料对象。

类规范

#ifndef ODO_H
#define ODO_H

#include "FuelGauge.h"

class Odometer
{
private:
    int currentMiles = 0;
    int maxMilage = 999999;
    FuelGauge* fuelObject = nullptr;
    int counter = 0;

public:
    Odometer(int, FuelGauge);

    int getMiles();

    void addMiles();
};

#endif ODO_H

类实现

#include "Odometer.h"

Odometer::Odometer(int currMileage, FuelGauge Gauge) {
    if (currMileage >= 0 && currMileage <= maxMilage) {
        currentMiles = currMileage;
    }
    else {
        cout << "Starting mileage is invalid" << endl;
    }

    fuelObject = &Gauge;
}

int Odometer::getMiles() {
    return currentMiles;
}

void Odometer::addMiles() {
    if (currentMiles < maxMilage) {
        currentMiles++;
        counter++;
    }
    else if (currentMiles >= maxMilage) {
        cout << "You have reached the max mileage ... resetting to zero!" << endl;
        currentMiles = 0;
    }

    if (counter >= 24) {
        fuelObject->useFuel();
        counter = 0;
    }
}

在 main 中,当我调用 getMiles() 函数时; “fuelObject”指向的对象的值已更改为某个随机大数。为什么会这样?

【问题讨论】:

  • 你能创建一个更小的对象来只操纵那个值而不是别的吗?此外,在某些(明显的)情况下,当返回的是一些大的随机 int 时,会返回对象的地址或随机内存单元。

标签: c++ class object pointers


【解决方案1】:

这应该是未定义的行为。

Odometer::Odometer(int currMileage, FuelGauge Gauge) {
    if (currMileage >= 0 && currMileage <= maxMilage) {
        currentMiles = currMileage;
    }
    else {
        cout << "Starting mileage is invalid" << endl;
    }

    fuelObject = &Gauge;
}

一旦你的构造函数完成执行,你的 fuelObject 就会指向垃圾,因为参数将超出范围并且它是 by-val。

除此之外,我必须同意@scheff 的观点,即您看到的错误可能不是由您显示的代码引起的。

【讨论】:

  • 通过价值传递FuelGauge Gauge - 我怎么能错过这个...... ;-)
  • 复习的时候不要跟我说漏掉的东西。 :D 我有故事要讲,没有各种适用的保密协议。
  • 非常感谢 ;-;。事实证明,只有你说的没有其他问题。我只是通过传入燃料类的地址而不是类对象本身来改变我构建里程表类的方式!
  • 对你有好处!但是,我建议您切换到使用 std::shared_ptr&lt;T&gt; 来共享所有权,而不是使用原始指针。你可以进一步阅读here
猜你喜欢
  • 2015-02-08
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多