我正在用C ++编写一个程序,使用我自己的头文件。
的main.cpp
#include<iostream>
#include"operation.h"
using namespace std;
main()
{
int a;
cout <<"Enter the value a";
cin>>a;
//class name add
//obj is object of add
add obj;
obj.fun(a);
}
operation.h
class add
{
void fun(int b)
{
int c,d=10;
c=d+b;
cout<<"d="<<d;
}
}
当我在Linux中使用G ++编译时,它显示以下错误:
->expected ";" before obj
->obj not declared in this scope
我该如何解决这个问题?为什么会这样?
答案 0 :(得分:8)
您需要在类add的顶部添加public:
。类成员的默认设置是将它们设为私有。
此外,您在类定义的末尾缺少分号。 C ++要求类定义以结束大括号后面的分号结束(实际上你可以在那个时候声明一个变量)。
答案 1 :(得分:2)
我没有看到错误的真正原因,但你应该插入包含警卫并且有一个缺失;在课程定义之后:
// operation.h
#ifndef OPERATION_H
#define OPERATION_H
class add {
public:
void fun( int b ) {
int c = 0; // always initialize, just in case
int d = 10;
c = d+b;
std::cout << "d=" << d;
}
};
#endif
编辑: main()返回类型不存在。你应该在那时添加一个'int'。
答案 2 :(得分:1)
如上所述,第一个“错误”在课后括号内缺少分号; 第二是私人访问违规(公开此方法),
我的建议(保持头文件“干净”)将类方法的定义放入*.cpp
文件中,并让您的标题仅包含声明(您将避免不必要的iostream标头包含。)
因此*.hpp
文件应仅包含:
class add {
public:
void fun( int b );
};
和*.cpp
void add::fun( int b)
{
//here goes implementation
}
答案 3 :(得分:1)
你是如何初始化课程的?请注意,以下是在C ++中实例化新“添加”对象的正确方法:
add a(params);
等同于以下内容:
add(params) a;
微妙的差异,绝对不同于其他语言的做法。可以想象产生“预期的”;错误。
顺便说一下,我同意上述评论者的观点,即课程应该大写并且不起作用。这是一个允许更高可读性的约定,您将在其他OO语言中重复使用。 OTOH,这假设可读代码为您的目标。是否使用CamelCase或下划线命名是更主观的,因此更有争议,恕我直言。
答案 4 :(得分:0)
对我而言,这似乎不是你遇到的唯一问题:
$ g++ -c /tmp/ttt.cpp
In file included from /tmp/ttt.cpp:2:
/tmp/operation.h: In member function ‘void add::fun(int)’:
/tmp/operation.h:8: error: ‘cout’ was not declared in this scope
/tmp/ttt.cpp: At global scope:
/tmp/ttt.cpp:4: error: expected unqualified-id before ‘using’
/tmp/ttt.cpp: In function ‘int main()’:
/tmp/ttt.cpp:8: error: ‘cout’ was not declared in this scope
/tmp/ttt.cpp:9: error: ‘cin’ was not declared in this scope
/tmp/operation.h:4: error: ‘void add::fun(int)’ is private
/tmp/ttt.cpp:14: error: within this context
确保首先解决头文件中的所有错误。