C++ 我不断收到错误C2248:无法访问类中声明的私有成员

C++ 我不断收到错误C2248:无法访问类中声明的私有成员,c++,C++,我的任务是创建一个程序,使用两个对象来处理有理分数的基本运算(加法、减法、乘法和除法) 对于我的每个函数,它总是给我这个错误-错误C2248:“rational::add”:无法访问在类“rational”中声明的私有成员 除了每个功能。 我不明白为什么是rational.cpp文件调用rational.h的成员 // Assingment3.cpp : This file contains the 'main' function. Program execution begins and en

我的任务是创建一个程序,使用两个对象来处理有理分数的基本运算(加法、减法、乘法和除法) 对于我的每个函数,它总是给我这个错误-错误C2248:“rational::add”:无法访问在类“rational”中声明的私有成员 除了每个功能。 我不明白为什么是rational.cpp文件调用rational.h的成员

// Assingment3.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include "application.h"
#include "rational.h"

int main()
{
    std::cout << "main function started!\n";
    application *myapp = new application();
    std::cout << "Application started!\n";
    myapp->run();
    delete myapp;
    std::cout << "Application terminated!\n";
    return 0;
}



//application.h

class application {

public:
    void run();
    application(); 
    ~application(); 



};


//application.cpp

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

application::application() {}

void application::run() {

    int num1, den1, num2, den2;
    char sign;
    cout << "enter a rational number (numerator them denominator seperated by a space) \n";
    cin >> num1 >> den1;
    cout << "enter an operator(+,-,* or /)";
    cin >> sign;
    cout << "enter a second rational number (numerator them denominator seperated by a space) \n";
    cin >> num2 >> den2;
    rational *myrat = new rational();
    myrat->operation(sign,num1,den1,num2,den2);

    //std::cout << "Rational started!\n";




}
application::~application(){}


//rational.h
class rational {

public:
    rational();
    ~rational();
    void operation(char sign, int num1, int den1, int num2, int den2);
private:

     void add(int num1,int den1,int num2, int den2);
     void subtract(int num1, int den1, int num2, int den2);
     void multiply(int num1, int den1, int num2, int den2);
     void divide(int num1, int den1, int num2, int den2);


};

//rational.cpp

#include <iostream>
#include "application.h"
#include "rational.h"
#include <string>

rational::rational(){
}

void operation(char sign, int num1, int den1, int num2, int den2) {
    rational dlg;
    std::cout << "operator started";
    if (sign == '+') {
    rational::add(num1, den1, num2, den2);
}
    if (sign == '-') {
        rational::dsubtract(num1, den1, num2, den2);
    }
    if (sign == '*') {
         rational::multiply(num1, den1, num2, den2);
    }
    if (sign == '/') {
         rational::divide(num1, den1, num2, den2);
    }
    else
        std::cout << "sign error\n";
}

void rational::operation(char sign, int num1, int den1, int num2, int den2)
{
}

void rational::add(int num1, int den1, int num2, int den2) {
    std::cout << "addition called \n";
    int den = den1 * den2;
    int num = (num1 * den2) + (num2 * den1);
    den1 = den;
    num1 = num;
    std::cout << "Answer :" << num << "/" << den << "\n";
}
void rational::subtract(int num1, int den1, int num2, int den2) {
    int den = den1 * den2;
    int num = (num1 * den2) - (num2 * den1);
    den1 = den;
    num1 = num;
    std::cout << "Answer :" << num << "/" << den << "\n";
}

void rational::multiply(int num1, int den1, int num2, int den2) {
    int den = den1 * den2;
    int num = num1 * num2;
    den1 = den;
    num1 = num;
    std::cout << "Answer :" << num << "/" << den << "\n";
}

void rational::divide(int num1, int den1, int num2, int den2) {
    int den = den1 * num2;
    int num = num1 * den2;
    den1 = den;
    num1 = num;
    std::cout << "Answer :" << num << "/" << den << "\n";
}

rational::~rational(){}
//Assingment3.cpp:此文件包含“main”函数。程序执行从那里开始并结束。
//
#包括
#包括“application.h”
#包括“rational.h”
int main()
{
std::cout>den1;
cout>符号;
cout>num2>>den2;
rational*myrat=new rational();
myrat->操作(符号,num1,den1,num2,den2);

//std::cout函数
add
subtract
divide
multiply
不是静态函数,因此不能使用格式:
class\u name::function\u name
来调用它们。用
this->function\u name(…)
或只调用
function\u name(…)
(来自当前对象)以使用它们

或者,您可以通过将它们的声明更改为:
static…function\u name(…)
使它们成为静态的,然后像以前那样调用它们


为什么是“静态的”?
static
意味着该方法属于该类,而不属于该类的特定对象实例。它看起来像是您的
rational
类的操作函数(add、substruct等)不需要任何
rational
类特定的对象成员来执行它们的操作。因为这些函数属于类,而不属于类的特定实例,有一个逻辑解释(您可以使用不同的参数调用相同的方法,并获得所需的结果,与当前对象状态无关),您可以将这些方法声明为静态方法


编辑: 我刚才注意到的另一个错误是,您对函数
operation
的定义是:
void operation(char-sign,int-num1,int-den1,int-num2,int-den2)
,这意味着它不属于该类,而不属于该类的函数的定义是什么也不做:

void rational::operation(char sign, int num1, int den1, int num2, int den2) {
}


删除无效操作(字符符号、int num1、int den1、int num2、int den2)
定义,并将内容移动到上面提到的类的函数定义中。

操作
是一个独立的函数,而不是
rational::操作
。将它们的声明更改为
静态
并没有帮助,因为我一直会得到完全相同的错误。执行
这个->
会带来它自己的新功能错误-
错误C2355:“this”:只能在非静态成员函数或非静态数据成员初始值设定项中引用
@Nyx您不能同时使用这两种方法。
属于非静态方法,
静态
关键字使函数
静态
。您只需添加
静态
关键字即可在这四行中的每一行前面加上d:
void add(…);void subtract(…);void multiply(…);void divide(…);
,并使它们成为:
static void add(…);static void subtract(…);static void multiply(…);static void divide(…);
。通过这种方式,您可以将其余代码保留在您的帖子中。我分别尝试了每一个代码。但都没有成功。幸运的是,我所有的问题似乎都源于您在编辑中注意到的
操作()
的问题。将其更改为
void rational::operation(字符符号,int num1,int den1,int num2,int den2)
在rational.cpp中修复了所有问题。感谢您的帮助。@Nyx对非静态函数使用
clasname::function
格式是错误的。