У меня есть два класса, которые я хочу вызвать по цепочке (основной -> выполнить -> вычислить). Однако проблема в том, что когда я использую:
&calculate::addition;
Добавление не будет вызываться, даже если компилятор не вернет ошибку. Если я попытаюсь удалить ссылку на
calculate::addition;
Компилятор возвращает ошибку
error: invalid use of non-static member function ‘void calculate::addition(double&, double, double)’
case 'a' : *calculate::addition; break;
^~~~~~~~
Пробовал использовать static перед void с тем же результатом, что и при использовании ссылки.
#include <iostream>
class execute{
public:
void exec(char);
}jalan;
class calculate {
public:
void addition(double&, double, double);
void substraction(double&, double, double);
void multiply(double&, double, double);
void division(double&, double, double);
};
int main(void){
static double a, b;
static double result;
std::cout << "Type a, b, c, or d" << std::endl;
std::cout << "a. Addition\nb. Substraction\nc. Multiply\nd. Division" << std::endl;
std::cout << "Your Input: ";
static char option;
option = getchar();
std::cout << "First value: ";
std::cin >> a;
std::cout << "Next value: ";
std::cin >> b;
jalan.exec(option);
std::cout << result << std::endl;
return 0;
}
void execute::exec (char option){
switch(option){
case 'a' : &calculate::addition; break;
case 'b' : &calculate::substraction; break;
case 'c' : &calculate::multiply; break;
case 'd' : &calculate::division; break;
}
}
void calculate::addition(double& result, double a, double b){
result = a+b;
}
void calculate::substraction(double& result, double a, double b){
result = a-b;
}
void calculate::multiply(double& result, double a, double b){
result = a*b;
}
void calculate::division(double& result, double a, double b){
result = a/b;
}
На самом деле весь этот код выглядит так, как будто у вас серьезные недопонимания по поводу C++ - вы даже не пытаетесь передать параметры в функции, которые вы пытаетесь вызвать в exec
.
@UnholySheep I считать намерение состоит в том, чтобы вернуть выбранную функцию из exec, а затем вызвать ее с помощью a
, b
и result
. Однако Op, похоже, не узнал о возвращаемых значениях (и, вероятно, не понял передаваемых параметров)
В вашем коде есть несколько проблем. Давайте начнем:
error: invalid use of non-static member function ‘void calculate::addition(double&, double, double)’ case 'a' : *calculate::addition; break;
Это означает, что вам нужно создать экземпляр вычисления или пометить метод статическим, например static void addition(double&, double, double);
.
Так что измените свой класс на
class calculate {
public:
static void addition(double&, double, double);
static void substraction(double&, double, double);
static void multiply(double&, double, double);
static void division(double&, double, double);
};
Следующая проблема заключается в том, что в вашем операторе switch вы создаете только указатели на функции.
void execute::exec (char option){
switch(option){
case 'a' : &calculate::addition; break;
case 'b' : &calculate::substraction; break;
case 'c' : &calculate::multiply; break;
case 'd' : &calculate::division; break;
}
}
Это никогда не выполняет функцию, а только создает указатель на функцию, который сразу же отбрасывается.
Чтобы заставить ваш код работать, рассмотрите этот код (обратите внимание на комментарии в коде, в которых объясняются необходимые изменения):
#include <iostream>
class execute
{
public:
void exec(char, double&, double, double);
}jalan;
class calculate {
public: // added static keyword so you do not need to create a class instance
static void addition(double&, double, double);
static void substraction(double&, double, double);
static void multiply(double&, double, double);
static void division(double&, double, double);
};
int main(void){
static double a, b;
static double result;
std::cout << "Type a, b, c, or d" << std::endl;
std::cout << "a. Addition\nb. Subtraction\nc. Multiply\nd. Division" << std::endl;
std::cout << "Your Input: ";
static char option;
option = getchar();
std::cout << "First value: ";
std::cin >> a;
std::cout << "Next value: ";
std::cin >> b;
jalan.exec(option, result, a, b); // you need to pass the arguments which you want to use and modify
std::cout << result << std::endl;
return 0;
}
void execute::exec (char option, double& res, double a, double b){
switch(option){ // changed the function pointers to actual calls to the functions
case 'a' : calculate::addition(res, a, b); break;
case 'b' : calculate::substraction(res, a, b); break;
case 'c' : calculate::multiply(res, a, b); break;
case 'd' : calculate::division(res, a, b); break;
}
}
void calculate::addition(double& result, double a, double b){
result = a+b;
}
void calculate::substraction(double& result, double a, double b){
result = a-b;
}
void calculate::multiply(double& result, double a, double b){
result = a*b;
}
void calculate::division(double& result, double a, double b){
result = a/b;
}
Надеюсь, это поможет понять ваши проблемы.
Чтобы вызвать любой метод в классе calculate, вы должны сначала объявить переменную, а затем вызвать метод, например:
calculate c;
double a,b,res;
c.addition(a,b,res);
или вы определяете методы как статические функции, в этом случае вызов будет таким
calculate::addition(a,b,res);
Почему вы ожидаете, что функция будет вызываться на
&calculate::addition;
? Вы понимаете, что означает этот синтаксис? Он создает указатель функции (на функцию-член), а затем отбрасывает его.