我刚刚开始学习编程,但遇到了一些麻烦。这是我想要做的:
但是出于某种原因,类函数使用一些奇怪的数字而不是类对象(我正在检查它们)。
#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
我在做什么错了?
答案 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*
(很容易,编译器将帮助您在不再使用旧代码的情况下引发错误)