刚开始是用c ++,然后是stackoverflow。 任何,并帮助无限感谢,如果我问一些超级愚蠢的事,请提前道歉
我正在编写程序来解决问题。多少个8位数字可被18整除,并且仅由数字1、2和3组成。我可以生成数字,但是当调用函数i使用模数确定它们是否可被18整除时,函数给我标题中的错误。我的代码如下:
main.cpp
#include <iostream>
#include "functions.h"
using namespace std;
int main()
{
functions f();
for(int a = 1; a<4; a++){
for(int b = 1; b<4; b++){
for(int c = 1; c<4; c++){
for(int d = 1; d<4; d++){
for(int e = 1; e<4; e++){
for(int f = 1; f<4; f++){
for(int g = 1; g<4; g++){
for(int h = 1; h<4; h++){
int number = 10000000*a + 1000000*b + 100000*c + 10000*d + 1000*e + 100*f + 10*g + h; //generates 8 digit numbers, only using the digits 1 2 and 3
cout << number << endl; //prints numbers
int y = 10; //to test this bloody function
cout << f.modu18()(y); //returns 0 or 1 from func
}}}}}}}}}
functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <iostream>
using namespace std;
class functions
{
public:
functions();
string modu18(int x);
protected:
private:
};
#endif
functions.cpp
#include "functions.h"
#include <iostream>
using namespace std;
functions::functions(){
cout << "Functions initialised!" << endl; //to see if this thing is actually loading
}
string functions::modu18(int x){ //this is checking whether the number is divisible by 18
if(x % 18 == 0){
return 0;
}else{
return 1;
};
} //btw, using multiple files becuase i want to learn how to make this work for the future
编译时返回的确切错误是
request for member 'modu18' in 'f', which is of non-class type 'int'
我不知道为什么这样说,我的所有数据类型对于数据和函数类型都是正确的。 发送帮助请 非常感谢。
答案 0 :(得分:0)
函数main
中有两个不同的f
:
第一个在这里
functions f();
是类型functions
的变量,或者至少是您所期望的类型(请参见注释,正确的定义将是functions f;
。就目前而言,这是使用以下函数声明的函数)没有参数,并返回类型为functions
的对象。
这里的第二个:
for(int f = 1; f<4; f++){
的类型为int
。
for循环的作用域与第一个声明所在的作用域不同(每个{}
引入了一个新作用域),因此允许其为不同的对象重用标识符。
如果您引用的是双重使用的名称,则会通过某些规则进行查找,在最常见的情况下,将使用范围最广的名称。因此在这里
cout << f.modu18()(y); //returns 0 or 1 from func
f
是类型int
的循环计数器,而不是外部范围中的f
声明。
使用不同的变量名来解决此问题。
与错误消息无关的其他内容:
您的函数modu18
应该返回一个string
,但是您所有的return语句都返回整数文字,这些文字是整数类型并且不能自动转换为std::string
,否则隐式转换将无法实现您的预期。
您不需要使用多个文件的类。在头文件中,可以使用string modu18(int);
声明一个自由函数,然后使用string modu18(int a) { ... }
在实现文件中对其进行定义。
使用using namespace std;
并不是一个好习惯,因为它将导致很难理解的错误。特别是在头文件中,永远不要使用它。而是使用std::
完全指定标准库中的所有名称。