【问题标题】:Object Constructor Call Not Declared In This Scope此范围内未声明对象构造函数调用
【发布时间】:2016-01-23 22:02:14
【问题描述】:

我自己解决了这个问题,方法是将 part_time.h 的 #include 移到 #include 列表的顶部。为什么这会有所不同,我不知道。

在将我的程序拆分为 makefile 之后,我遇到了一个手动对象构造调用问题。每个 .cpp 都有一个包含它的 .h,而 main.cpp 也包含每个 .h。

相关代码如下。错误是:

main.cpp:在函数“void add_part_time()”中: main.cpp:166:2:错误:“part_time”未在此范围内声明 part_time part_time1(姓名、叉车、年假、病假); ^

main.cpp:166:12: 错误:在“part_time1”之前需要“;” part_time part_time1(姓名、叉车、年假、病假);

我注意到了一些奇怪的事情。如果我删除 ;在sick_leave 定义行之后,我得到的唯一错误是询问丢失的相同错误;另一个错误消失了。

#include <string>
using namespace std;

class employee
{
    public:
        static int count;
        employee (std::string name);
        string name;
        ~employee();
};

employee::employee (string set_name) 
{
    name = set_name;
}

employee::~employee()
{

}

class dockhand: public employee
{
    public:
        dockhand (string set_name, bool set_forklift);
        float start_shift;
        bool forklift;
        float payrate;
        ~dockhand();
};

dockhand::dockhand (string set_name, bool set_forklift) : employee (set_name)
{
    forklift = set_forklift;
    start_shift = 4.00;
}

dockhand::~dockhand()
{

}

class part_time: public dockhand
{
    public:
        part_time (string set_name, bool set_forklift, int annual_leave, int sick_leave);
        float end_shift;
        int annual_leave;
        int sick_leave;
        ~part_time();
};

part_time::part_time (string set_name, bool set_forklift, int annual_leave, int sick_leave) : dockhand (set_name, set_forklift)
{
    end_shift = 8.00;
    payrate = 22.00;
}

part_time::~part_time()
{

}

void add_part_time()
{
    string name;
    bool forklift;
    int annual_leave;
    int sick_leave;
    name = "bob";
    forklift = true;
    annual_leave = 2;
    sick_leave = 3;
    part_time part_time1(name, forklift, annual_leave, sick_leave);
}

然而,完全相同的格式在下面用另一个类编译得很好。

void add_casual()
{
    string name;
    bool forklift;
    name = "bob";
    forklift = true;
    casual casual1(name, forklift);
}

我不知道问题出在哪里。注释掉构造行使它可以编译,所以它肯定是存在的。

编辑 更改part_time part_time1(姓名、叉车、年假、病假);临时构造函数调用的行使其可以使用makefile进行编译。因此,即使包含正确,该特定行仍然存在问题。

【问题讨论】:

  • MCVE 真的很有帮助。我收到了completely different error
  • 附带说明,我认为最好使用以大写字母开头的类名。例如,class Part_time: public Dockhand。它使代码更具可读性,尤其是当您有名称与返回类型匹配的函数时,例如part_time part_time1(name, forklift, annual_leave, sick_leave);
  • 好吧,我只是将它们正确地融合到一块代码中,并且编译得很好,但是我的 makefile 设置仍然给我上面的错误。你知道为什么会发生这种情况吗?
  • 可能是您在一个文件中定义了void add_part_time(),而该文件既没有#include,也没有前向声明,类part_time。当所有内容都在一个文件中时,没问题,但是如果您拆分内容,编译器不知道part_time 是什么。这是针对您的第一个错误。就第二个而言,它可能与第一个有关,或者可能是一个微不足道的语法错误。没有看到确切的代码很难说。我会先处理第一个,看看你修复它会发生什么。
  • 无法复制!这段代码在我的旧 MSVC2008 中编译得很好......

标签: c++ class constructor compiler-errors


【解决方案1】:

我自己解决了这个问题,方法是将 part_time.h 的 #include 移到 #include 列表的顶部。绝对没有其他任何改变。为什么这会有所不同,我不知道。

【讨论】:

  • 那么这意味着您包含的其他文件之一也需要类part_time,因此如果您首先包含part_time.h,它们会起作用,否则他们会尝试使用没有' 还没有被声明,他们还没有看到,因此你得到了错误。只需在包含的文件中搜索所有使用 part_time 类(或在 part_time.h 中声明的任何其他类)的位置,您就会找到它。
  • 这就是我的想法,我只是看不到它。除了层次结构之外,其他类都没有相互交互,part_time 是它的最后一个子级。除了 main.cpp 和 part_time.cpp 之外,没有任何东西依赖它。
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 2020-11-25
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多