小编Eri*_* Pi的帖子

C++多重继承 - 为什么你不工作?

我试图找出一个有趣的多继承问题.

祖父母是一个有多种方法的接口类:

class A
{
public:
    virtual int foo() = 0;
    virtual int bar() = 0;
};
Run Code Online (Sandbox Code Playgroud)

然后有部分完成此接口的抽象类.

class B : public A
{
public:
    int foo() { return 0;}
};

class C : public A
{
public:
    int bar() { return 1;}
};
Run Code Online (Sandbox Code Playgroud)

我想要使​​用的类继承自两个父类,并指定通过using指令应该来自哪个方法:

class D : public B, public C
{
public:
    using B::foo;
    using C::bar;
};
Run Code Online (Sandbox Code Playgroud)

当我尝试实例化DI获取错误以尝试实例化抽象类时.

int main()
{
    D d; //<-- Error cannot instantiate abstract class.

    int test = d.foo();
    int test2 = d.bar();

    return …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance multiple-inheritance diamond-problem

8
推荐指数
1
解决办法
1259
查看次数

使用不受信任的格式字符串安全地调用strftime

我们有一个C++/MFC应用程序,允许用户通过配置文件自定义日期格式.我不想重新发明轮子,我将格式字符串传递给CTime :: Format("<format string>")来进行实际的格式化.在封面下,Format调用标准C函数strftime()的变体.

当然,用户可能会意外输入无效的格式字符串.(例如,"%s"而不是"%S".)发生这种情况时,C运行时调用无效参数处理程序,默认情况下退出应用程序.(没有例外可以捕获 - 只需app退出.)

我的问题是如何优雅地处理这种不受信任的输入.从理论上讲,我可以为格式字符串编写自己的解析器/验证器,但这听起来像是浪费时间.相反,我能想到的最好的方法是设置我自己的(全局)无效参数处理程序,它不会退出,而是抛出一个无效参数异常:

void MyInvalidParameterHandler(
    const wchar_t* expression,
    const wchar_t* function, 
    const wchar_t* file, 
    unsigned int line, 
    uintptr_t pReserved)
{
    ::AfxThrowInvalidArgException();
}
Run Code Online (Sandbox Code Playgroud)

这看起来确实有效,并且允许我在我"期望"它们发生的情况下显式地捕获(并且优雅地处理)无效的参数异常.但是,我担心我会在大型应用程序中覆盖全局的运行时设置以解决相对"本地"的问题 - 我讨厌这个修复程序在其他地方引起其他问题.

这种方法是否明智?或者是否有更清洁的方法来解决这个问题?

validation mfc strftime

5
推荐指数
1
解决办法
1906
查看次数