我有:
错误a1未在此范围内声明
有人可以解释为什么这段代码会导致这种情况吗?
#ifndef QUIZ_H_
#define QUIZ_H_
#include "quiz.cpp" // I deleted this row
// and wrote void quiz(int i);
class A {
private:
int player;
public:
A(int initPlayer); // wrote here = 0
~A();
void foo();
};
#endif /* QUIZ_H_ */
#include "quiz.h"
#include <iostream>
using std::cout;
using std::endl;
A::A(int initPlayer = 0){ // deleted = 0
player = initPlayer;
}
A::~A(){
}
void A::foo(){
cout << player;
}
#include "quiz.h"
int main()
{
quiz(7);
return 0;
}
#include "quiz.h"
void quiz(int i)
{
A a1(i);
a1.foo();
}
我的修改后发生错误multiple definition of quiz(int)
答案 0 :(得分:2)
请#include quiz.cpp
来自quiz.h
!
答案 1 :(得分:2)
您不应该在标头中包含.cpp文件。删除:
#include "quiz.cpp"
此外,默认值为:
A::A(int initPlayer = 0){
应该在头文件中。
编辑你的问题提供所有文件的名称,以便我们告诉你如何编译和链接它们。
答案 2 :(得分:1)
永远不要包含.cpp文件。头文件用于声明将存在哪些函数,因此编译器知道您将在稍后(在链接时)提供实现。所有#include指令都将给定文件复制/粘贴到源中。因此,在头文件中,您在声明之前获得了源文件的内容。这不会导致递归包含的唯一原因是因为#ifndef标记。
如果要查看#include标记对代码执行的操作,大多数C ++编译器只允许您执行预处理阶段。对于gcc来说,就是这样:
gcc -E main.cpp
正如其他人所说,默认值会出现在头文件中。
答案 3 :(得分:0)
我认为你的包含在错误的地方。
quiz.h不应该包括quiz.cpp中的类的实现
实现应该在quiz.cpp中
要让main了解void quiz(int i)
,那么你需要在头文件中声明这个并在main和函数文件中包含这个头文件(或者在这个cas中只是将函数代码放在与main相同的文件中,然后在它之前)< / p>