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