请求f中的成员“ modu18”,该成员属于非类类型“ int”

时间:2018-11-16 22:53:41

标签: c++

刚开始是用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'

我不知道为什么这样说,我的所有数据类型对于数据和函数类型都是正确的。 发送帮助请 非常感谢。

1 个答案:

答案 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声明。

使用不同的变量名来解决此问题。

与错误消息无关的其他内容:

  1. 您的函数modu18应该返回一个string,但是您所有的return语句都返回整数文字,这些文字是整数类型并且不能自动转换为std::string,否则隐式转换将无法实现您的预​​期。

  2. 您不需要使用多个文件的类。在头文件中,可以使用string modu18(int);声明一个自由函数,然后使用string modu18(int a) { ... }在实现文件中对其进行定义。

  3. 使用using namespace std;并不是一个好习惯,因为它将导致很难理解的错误。特别是在头文件中,永远不要使用它。而是使用std::完全指定标准库中的所有名称。