我有一个名为logs_i的类,其中包含一个名为begin_record的虚拟函数; 我不得不写一个名为counter_logs_t的新类,它应该有一个计算日志的方法。
这是counter_logs_t的接口和实现:
class counter_logs_t : public log_i
{
public:
counter_logs_t(int counter);
void print_counter(void);
void add_counter(void);
virtual void begin_record(void);
private:
int counter;
};
counter_logs_t::counter_logs_t(int counter) : log_i()
{
counter = 0;
}
void counter_logs_t::add_counter(void)
{
counter++;
}
void logs_t::begin_record(void)
{
log_i::begin_record();
add_counter();
}
void counter_logs_t::print_counter(void){
cout<< counter<< endl;
}
int main()
{
counter_logs_t container1();
//some code
container1.print_counter();
return 0;
}
当我尝试构建时出现以下错误: 错误:未在范围
中声明'add_counter'答案 0 :(得分:1)
此功能的签名不正确,特别是班级名称
void logs_t::begin_record(void)
我认为你的意思是
void counter_logs_t::begin_record(void)
编辑:
你的第二个问题是你在这一行遇到了the most vexing parse
counter_logs_t container1();
这被解释为声明一个名为container1
的函数,该函数不带参数并返回coutner_logs_t
。实际上,counter_logs_t
没有默认构造函数,唯一的构造函数具有以下签名
counter_logs_t(int counter);
因此,您必须使用counter
参数构建它。
counter_logs_t container1{0};
counter_logs_t container1 = counter_logs_t(0);
或制作默认构造函数
counter_logs_t::counter_logs_t() : log_i(), counter(0) {}
然后你可以说
counter_logs_t container1;
答案 1 :(得分:1)
你还有一个问题
counter_logs_t container1();
不是声明变量。它声明了一个名为container1
的函数,该函数重新计算counter_logs_t
并且不执行任何操作。您需要将其更改为
counter_logs_t container1;
申报变量。
答案 2 :(得分:0)
void logs_t::begin_record(void)
{
log_i::begin_record();
add_counter();
}
在这个函数中:
1.“logs_t”应为“counter_logs_t”。
2.我不建议您使用“::”运算符调用类log_i的方法begin_record()
,除非您知道它是静态方法。你最好把它称为this->begin_record
,因为它是一种虚拟方法。