我试图在一个类中定义一个函数,然后在.cpp程序中使用它。我已经在main上面声明了该函数,但无法弄清楚为什么我得到范围声明中未声明的错误。
来自g ++的错误:“此范围内未声明错误:'convert'”
谢谢。
A.h:
class A
{
public:
int convert(char bcd);
};
program.cpp:
#include "A.h"
#include <iostream>
#include<stdio.h>
using namespace std;
int A::convert(char b)
{
return b*5;
}
int main(){
char myword = '27';
char cc = convert(myword); //scope error here
cout << "Number is: " << cc << endl;
return 0;
}
答案 0 :(得分:2)
错误本身是因为您没有任何由名称convert()
定义的“自由功能”,该名称可以在您尝试调用它的范围内直接访问的任何范围内。您有一个是class A
的成员方法(“函数”)的方法,但没有在该类之外定义的方法。因此,是的,您定义了一个名为convert()
的“函数”,但是在您试图调用它的范围内它是不可访问的。您必须添加一些内容来告诉编译器在哪里可以找到您要调用的“ convert()
”函数。有几种方法可以做到:
::
范围解析运算符)来解析范围。::
范围解析运算符(例如“ namespaceName::functionName()
”),或者使用“ using
”关键字将该函数的名称带入当前范围。由于您要询问类成员方法,因此在以下讨论中,我将忽略上面的#3。...
您将有一个class A
的实例吗?如果是这样,说您称它为“弗雷德”,那么您可以叫fred.convert(myword);
。但是A::convert()
不使用class A
的任何成员数据,因此也许您希望它是一个静态成员方法(即,即使没有类类型的对象也可以调用它),在其中需要将该方法声明为static
,并且在调用它时,请使用“ A::convert(myword);
”。
下面是创建class A
实例并在其上调用方法A::convert()
的示例:
===== file 'A.h' =====
class A
{
public:
int convert(char bcd);
};
===== file 'program.cpp' =====
#include "A.h"
#include <iostream>
#include<stdio.h>
using namespace std;
int A::convert(char b)
{
return b*5;
}
int main()
{
char myword = '27';
A fred; // create an instance of class A named "fred"
char cc = fred.convert(myword);
cout << "Number is: " << cc << endl;
}
下面是一个示例,其中A::convert()
是静态成员方法,并且不需要类的实例来调用该方法:
===== file 'A.h' =====
class A
{
public:
static int convert(char bcd); // <--- note 'static' keyword
};
===== file 'program.cpp' =====
#include "A.h"
#include <iostream>
#include<stdio.h>
using namespace std;
int A::convert(char b)
{
return b*5;
}
int main()
{
char myword = '27';
A fred; // create an instance of class A named "fred"
char cc = fred.convert(myword); // you can call convert() on an A object
char dd = A::convert(myword); // or you can call it without an A object
cout << "Number cc is: " << cc << endl;
cout << "Number dd is: " << dd << endl;
}
答案 1 :(得分:1)
您混淆了三件事:
一个函数是一组要连续执行的命令。您可以这样声明它们:
type function(type parameter1, type parameter2 /*etc */);
您可以这样定义它们:
type function(type parameter1, type parameter2 /*etc */) {
// implementation...
}
并这样称呼他们:
type myvar = function(parameter1,parameter2 /*etc */);
Class方法是一个函数,它也是一个类的成员。它通常使用实例数据执行某些操作。您可以这样声明它们:
class A
{
public:
type method(type parameter1, type parameter2);
};
这样定义它们:
type A::method(type parameter1, type parameter2)
{
return b*5;
}
并这样称呼他们:
A myVar;
myVar.method(parameter1,parameter2);
最后,有@phonetagger建议,这是静态类方法。这些就像常规方法一样,但是通常不涉及实例数据。但是,它们通常以某种方式与班级相关。您可以这样声明它们:
class A
{
public:
static type method(type parameter1, type parameter2);
};
这样定义它们:
type A::method(type parameter1, type parameter2)
{
return b*5;
}
并这样称呼他们:
A::method(parameter1,parameter2);
您需要确定真正需要哪一个,并正确实施。