ошибка: неверное использование нестатической функции-члена C ++ - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть два класса, которые я хочу вызвать по цепочке (основной -> выполнить -> вычислить). Однако проблема в том, что когда я использую:

&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 с тем же результатом, что и с использованием reference.

#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;   
}

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Чтобы вызвать любой метод в классе вычисления, вы должны сначала объявить переменную, а затем вызвать метод, например:

calculate c;
double a,b,res;
c.addition(a,b,res);

или вы определяете методы как статические функции, в этом случае вызов будет похожчто

calculate::addition(a,b,res);
0 голосов
/ 13 сентября 2018

У вас есть несколько проблем в вашем коде. Давайте начнем:

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;   
}

Надеюсь, это поможет понять ваши проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...