如何继承一个带变参方法的类?附上我写的代码,请高手指点。

shi_hang_nk 2010-07-16 07:36:26
我试了如下方法来继承,但编译报错

class A{
public:
A(int i, char* pcszFormat, ...) {}
};

class B: public A
{
public:
B(int i, char* pcszFormat, ...) : A(i, pcszFormat, ...){}
};

1>d:\testcplusplus\testcplusplus.cpp(82) : error C2059: syntax error : '...'
1>d:\testcplusplus\testcplusplus.cpp(82) : error C2512: 'A' : no appropriate default constructor available
...全文
158 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
shi_hang_nk 2010-07-17
  • 打赏
  • 举报
回复
va_start会在父类里重新初始化va_list,所以要去掉。
大大啊 2010-07-16
  • 打赏
  • 举报
回复
学习了 ~~·~~
mymtom 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shi_hang_nk 的回复:]

谢谢各位参与。我已经解决了,在A的构造函数里去掉va_start就可以了。
[/Quote]
这个方法似乎不对啊,难道一定需要一个va_list的构造函数?

#include <iostream>
#include <cstdarg>

class FOO
{
public:
FOO() {}
FOO(const char *fmt, va_list ap)
{
vprintf(fmt, ap);
}
FOO(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
FOO(fmt, ap);
va_end(ap);
}

};

class BAR : public FOO
{
public:
BAR() {}
BAR(const char *fmt, va_list ap) : FOO(fmt, ap)
{
}
BAR(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
BAR(fmt, ap);
va_end(ap);
}
};

int main(void)
{
BAR bar("%s:%d\n", __FILE__, __LINE__);
return 0;
}
太乙 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shi_hang_nk 的回复:]

谢谢各位参与。我已经解决了,在A的构造函数里去掉va_start就可以了。
[/Quote]为什么要去掉??用的很对啊,就要va_start
mymtom 2010-07-16
  • 打赏
  • 举报
回复
我仔细查了一下,只有用g++ -O2 编译才正常输出。
看来BAR(const char *fmt, ...) : FOO(fmt)的写法是有问题的。
shi_hang_nk 2010-07-16
  • 打赏
  • 举报
回复
谢谢各位参与。我已经解决了,在A的构造函数里去掉va_start就可以了。
shi_hang_nk 2010-07-16
  • 打赏
  • 举报
回复
to mymtom:

我试了一下你的方法,输出的是乱码呀。你执行正常吗?
mymtom 2010-07-16
  • 打赏
  • 举报
回复

#include <iostream>
#include <cstdarg>

class FOO
{
public:
FOO(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
}
};

class BAR : public FOO
{
public:
BAR(const char *fmt, ...) : FOO(fmt)
{
}
};

int main(void)
{
BAR bar("%s:%d", __FILE__, __LINE__);
return 0;
}
shi_hang_nk 2010-07-16
  • 打赏
  • 举报
回复
Hi mstlq,

执行的结果不对呀

class A{
public:
A(){}
A(int i, char* fmt, ...)
{
va_list args;
va_start(args, fmt);
char* szBuffer = new char[100];
vsprintf(szBuffer, fmt, args );
va_end(fmt);

cout<<i<<endl;
cout<<szBuffer<<endl;
}
};

class B: public A
{
public:
B(int i, char *fmt, ...) : A(i, fmt){}
};


int main(int argc, char* argv[])
{
B b(1, "%s %d", "aaaa", 123);
return 0;
}

执行后输出 :
1
`? 0
第2个cout输出乱码,似乎是调用A的构造函数,没有输入args。
耍宝王 2010-07-16
  • 打赏
  • 举报
回复
我还以为要另外为A定义一个用va_list的构造函数呢,学习了
yunyun1886358 2010-07-16
  • 打赏
  • 举报
回复
还能这样写,学习了。
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
求一篇博客详细介绍这东西的
liutengfeigo 2010-07-16
  • 打赏
  • 举报
回复
C++也可以而加....?
mstlq 2010-07-16
  • 打赏
  • 举报
回复
这样……

class A
{
public:
A(int i, char* pcszFormat, ...) {}
};

class B: public A
{
public:
B(int i, char* pcszFormat, ...) : A(i, pcszFormat) {}
};
justinlm 2010-07-16
  • 打赏
  • 举报
回复
你没有给A类和B类写默认的构造函数,
一般类必须有吧!
如果你不想让A能创建默认的实例,那你就的把默认的无参的构造函数设为私有的
这样就行了。
还有你代码中参数有...不行吧

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧