当构造函数中有可变参数时,子类继承时,如何调用父类构造函数?

WuLoveXue 2011-06-13 01:45:22
是不是有点绕口?看代码:

class Exception
{
public:
Exception(const char *format, ...)
{
va_list ap;

va_start(ap, format);
snprintf(_message, EXCEPTION_ERROR_MESSAGE_MAX_SIZE, format, ap);
va_end(ap);
}

inline virtual const char *getMessage() { return _message; }

private:
char _message[EXCEPTION_ERROR_MESSAGE_MAX_SIZE];

};

class OpenFailed: public Exception
{
public:
OpenFailed(const char *format, ...): Exception(format, ...)
{
}
};


关键OpenFailed(const char *format, ...): Exception(format, ...)如何实现?这里用不了va_start类函数。。。
...全文
471 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ga6840 2011-06-27
  • 打赏
  • 举报
回复
mark
WuLoveXue 2011-06-16
  • 打赏
  • 举报
回复
重载<<操作符解决了,C++类方法中不能用变参!
QQIANQQ 2011-06-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dizuo 的回复:]
引用 3 楼 wulovexue 的回复:

意思C++类方法中不能用可变参数?可能和C的函数参数压栈方式有关吧!
但编译的确能通过

你运行一下试试,
可变参数不要作为构造函数参数,这样:

C/C++ code


class Base {
public:
Base (void);
Base (const char *str, ...); // <-- this w……
[/Quote]最近刚好看了一下
more effective c++条款25 : 将constructor和non-member function 虚化。P125
里边提到了一种情况是 class A;
A::A(istream& str);
ri_aje 2011-06-15
  • 打赏
  • 举报
回复
8楼,所以我说 c++03 中不行,c++0x中可以,现在主流编译器都支持 c++0x 了。
ClassDan 2011-06-13
  • 打赏
  • 举报
回复
没见过这种用法,学习了。。。
WuLoveXue 2011-06-13
  • 打赏
  • 举报
回复
int main()
{
Exception exp("abc:%d", 100);

printf(exp.getMessage());
}


的确能运行,不过%d处打印的值错了!
WuLoveXue 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ri_aje 的回复:]
c++03 中不行,c++0x中,可以这样,

C/C++ code

#include <iostream>
using namespace std;

struct base_t
{
template <typename T, typename ... Ts>
base_t (T t, Ts ... ts)
{
std::cout << "base_t :: ……
[/Quote]


ISO C++中模版不能使用可变参数
ri_aje 2011-06-13
  • 打赏
  • 举报
回复
c++03 中不行,c++0x中,可以这样,

#include <iostream>
using namespace std;

struct base_t
{
template <typename T, typename ... Ts>
base_t (T t, Ts ... ts)
{
std::cout << "base_t :: base_t ()" << std::endl;
}
};

struct derived_t : base_t
{
template <typename T, typename ... Ts>
derived_t (T t, Ts ... ts) : base_t(t,ts...)
{
std::cout << "derived_t :: derived_t ()" << std::endl;
}
};

int main ()
{
derived_t d(1,1.,'a');
return 0;
}
WuLoveXue 2011-06-13
  • 打赏
  • 举报
回复
OK,我试试!!!
wangsifu2009 2011-06-13
  • 打赏
  • 举报
回复
从来遇见过~~
ryfdizuo 2011-06-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wulovexue 的回复:]

意思C++类方法中不能用可变参数?可能和C的函数参数压栈方式有关吧!
但编译的确能通过
[/Quote]
你运行一下试试,
可变参数不要作为构造函数参数,这样:

class Base {
public:
Base (void);
Base (const char *str, ...); // <-- this would call Init()
protected:
void Init (va_list args);
};

class Derived : public Base {
public:
Derived (const char *str, ...) {
// call's Base Init with va_list...
va_list args;
va_start(args, str);
Init(args);
va_end(args);
}
};
WuLoveXue 2011-06-13
  • 打赏
  • 举报
回复
意思C++类方法中不能用可变参数?可能和C的函数参数压栈方式有关吧!
但编译的确能通过
ryfdizuo 2011-06-13
  • 打赏
  • 举报
回复
第一次见构造函数用可变参数的。

65,190

社区成员

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

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