【发布时间】:2016-01-28 16:40:59
【问题描述】:
考虑以下两个类:
class Parent
{
private:
char outputBuffer[100];
protected:
virtual void WriteOutput() = 0;
};
class Child : public Parent
{
private:
double value1;
double value2;
void WriteOutput()
{
sprintf(outputBuffer, "%.2f %.2f", value1, value2);
}
};
父级定义了一个virtual 函数,然后在子级中实现该函数,其目的是将格式化的字符串写入输出缓冲区。
我的挑战是我不希望输出缓冲区对子类直接可见。换句话说,我希望 WriteOutput 看起来像:
void WriteOutput()
{
myFcn("%.2f %.2f", value1, value2);
}
但是myFcn() 看起来像什么?它应该只是中继到 sprintf 但在 sprintf 中支持可变参数所需的语法让我感到困惑。是否可以传递可变数量的参数?我在示例中显示了两个值,但不同的子项将具有不同数量的值,因此我必须保留 sprintf 的可变参数功能。请注意,性能在这里很重要,所以我不能有不必要的字符串副本。
如果在这种情况下有更好/更有效的 sprintf 替代方案,我可以考虑。谢谢。
【问题讨论】:
-
this 是您要找的吗?
-
@chris 这个答案来自 2009 年。C++11 有更好的可能性。
-
不要在底部使用
vsprintf,而是使用C++ 可变参数模板函数。这是引入可变参数模板时最常提供的示例之一。 -
由于函数是
virtual,所以template将不适用(直接)。 -
@KonradRudolph,同意。那纯粹是为了如何传递可变参数。
标签: c++ inheritance virtual-functions