2015-10-24 90 views
2

I have managed to solve this myself by moving the #include for part_time.h to the top of the #include list. Why this made a difference, I have no idea.对象构造函数调用未声明在此范围内

我有我的分裂程序转换成一个makefile后一个手动对象构建呼叫的问题。每个.cpp都有一个包含它的.h,main.cpp也包含每个.h。

相关代码如下。错误是:

main.cpp: In function ‘void add_part_time()’: main.cpp:166:2: error: ‘part_time’ was not declared in this scope part_time part_time1(name, forklift, annual_leave, sick_leave); ^

main.cpp:166:12: error: expected ‘;’ before ‘part_time1’ part_time part_time1(name, forklift, annual_leave, sick_leave);

我注意到了一些奇怪的东西。如果我删除了;在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(name,forklift,annual_leave,sick_leave);行到随便的构造函数调用使它与一个makefile很好地编译。所以即使包含正确,该特定行仍然有问题。

+1

[MCVE](http://stackoverflow.com/help/mcve)会真的有所帮助。我得到[完全不同的错误](http://coliru.stacked-crooked.com/a/f201f8e68c9e4b8d)。 – chris

+0

在附注上,我认为最好使用以大写字母开头的类名。例如,'class Part_time:public Dockhand'。它使代码更具可读性,特别是当你的函数的名字与返回类型相匹配时,比如'part_time part_time1(name,forklift,annual_leave,sick_leave);' –

+0

好吧,我只是把它全部合并到了一块代码中,好,但我的生成文件设置仍然给我上面的错误。你有什么想法为什么会发生? –

回答

0

我已经设法通过将#include for part_time.h移动到#include列表的顶部来解决这个问题。绝对没有其他改变。为什么这有所作为,我不知道。

+0

然后它意味着你所包含的其他文件之一也需要class'part_time',所以如果你首先包含'part_time.h',否则它们会尝试使用尚未声明的东西,而且他们还没有看到,所以你会得到错误。只要搜索包含文件中所有使用类'part_time'(或其他在'part_time.h'中声明的类)的地方,就可以找到它。 –

+0

这就是我想过的,我只是看不到它。其他类除了层次结构之外没有其他类相互影响,哪个part_time是最后一个子类。除main.cpp和part_time之外,没有什么依赖它。CPP,这两个都包括。 –