“未在此范围内声明”错误的问题

时间:2010-06-14 17:18:38

标签: c++

我有:

  

错误a1未在此范围内声明

有人可以解释为什么这段代码会导致这种情况吗?

quiz.h

#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_ */

quiz.cpp

#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)

4 个答案:

答案 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>