函数从指针C ++获取错误的值并返回错误的答案

时间:2018-09-15 12:30:34

标签: c++

我刚刚开始学习编程,但遇到了一些麻烦。这是我想要做的:

  1. 使用构造函数创建一个新类;
  2. 将用户的两个数字写入一个类对象;
  3. 使用此类的函数获得两个数字的和;

但是出于某种原因,类函数使用一些奇怪的数字而不是类对象(我正在检查它们)。

#include "pch.h"
#include <iostream>
#include <string>
using namespace std;

class math_function {
public:
    string function_string;
    double function_result;
};

class binary_operation : public math_function {
public:
    double* argument_1;
    double* argument_2;
};

class sum : public binary_operation {
public:
    sum(double arg1, double arg2) {
        this->argument_1 = &arg1;
        this->argument_2 = &arg2;
        cout << *this->argument_1 << " INSIDE CONSTR " << *this->argument_2 << "\n";
    }

    double evaluate() {
        cout << *this->argument_1 << " pointers " << *this->argument_2 << "\n";
        this -> function_result = *this->argument_1 + *this->argument_2;
        return function_result;
    }
};

int main(int argc, string argv)
{
    cout << "enter two nubmers\n";
    double arg1, arg2;
    std::cin >> arg1;
    std::cin >> arg2;
    sum* sum1 = new sum(arg1, arg2);
    double result = sum1->evaluate();
    cout << "\n" << result;
    system("Pause");
}

这是控制台的输出:

enter two numbers
29
13
29 INSIDE CONSTR 13
-9.25596e+61 pointers 1.23419e-305
-9.25596e+61

我在做什么错了?

2 个答案:

答案 0 :(得分:3)

this->argument_1 = &arg1;       // NO 

与您要执行的操作相反。您正在将指针成员设置为arg1的地址,该地址是构造函数的本地地址。在您尝试打印该值时,arg1已久。如果需要的话

*(this->argument_1) = arg1;     // still NO

这会将arg1的值分配给double指向的argument_1。但是,您从未分配过double,因此argument_1并不指向双精度型。取消引用无效的指针是未定义的行为!

根本不使用指针。最好使用初始化列表...

struct binary_operation : public math_function {
    double argument_1;
    double argument_2;
    binary_operatotion(double arg1,double arg2) : argument_1(arg1),argument_2(arg2) {}
};

struct sum : public binary_operation {
    sum(double arg1, double arg2) : binary_operation(arg1,arg2) {}
};

答案 1 :(得分:0)

您将在参数1和2中存储(按值)传递给构造函数的两个参数的地址。 一旦退出函数,这些地址就不再有意义了(是的,构造函数也是(也是)函数。

您有不同的选择。 首先是将参数作为指针传递,而不是复制值

sum(double* arg1, double* arg2) {
    this->argument_1 = arg1;
    this->argument_2 = arg2;
    cout << *this->argument_1 << " INSIDE CONSTR " << *this->argument_2 << "\n";
}

但是实际上,您根本不需要指针:只需将参数存储为double,而不是double*

class binary_operation : public math_function {
public:
    double argument_1;
    double argument_2;
};

并更改所有代码以使用double而不是double*(很容易,编译器将帮助您在不再使用旧代码的情况下引发错误)