【发布时间】: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