4

我正在尝试编写一个异常类,以便与行为类似于 printf 的构造函数一起使用,例如:

class ExcBase
{
    ExcBase(const char *fmt, ...)
    {
        // call things like vsprintf
    }
};

但是构造的继承在 c++ 中似乎不可用,所以我想编写一个继承类,如:

class ExcChild : public ExcBase
{
    ExcChild(const char *fmt, ...)
       : ExcBase(fmt, ...) // XXX: how to pass the trailing parameters to the constructor?
    {
    }
};

或者我将不得不为所有子类编写相同的构造函数,这太烦人了......

这个问题让我很困扰,我想不出解决这个问题的方法……任何信息都会有很大的帮助……

4

4 回答 4

1

如果您不需要在不支持它的旧编译器上编译代码,则可以使用 using 子句继承构造函数(不过,即将推出的 VC++11 将被视为“旧”...)

或者,也许您可​​以将实际的构造工作放在类似 vprintf 的函数中,并让构造函数调用它。

于 2012-04-19T03:06:21.790 回答
1

不要试图在构造函数中完成所有工作。把它分成几块——提供一个函数,以你想要的任何方便的方式构建一个字符串,并将该字符串传递给构造函数。

std::string format_string(const char * fmt, ...);

class ExcBase
{
    ExcBase(const std::string & message);
};
于 2012-04-19T03:30:17.067 回答
0

您可以使用 C++11 元组对其进行模板化——但这是我唯一能想到的。

于 2012-04-19T03:20:44.640 回答
0

如果您将复杂的工作分离到一个带有 va_list 参数的函数中,您应该能够从每个子构造函数中调用它(您仍然必须为每个子类型实现它)。然后您的重复代码(每个类)将只是声明 va_list,然后调用 va_start、您的新(基本)函数和 va_end。这里有一个关于这样做的帖子

于 2012-04-19T03:32:28.613 回答