【问题标题】:How to verify a data type input如何验证数据类型输入
【发布时间】:2014-07-13 16:36:31
【问题描述】:

我有一个队列,如果输入的数据与队列中的数据类型不同,我需要验证输入数据类型并处理异常,我该怎么做? 主.cpp

try {
    cout << "Insert character: ";
    cin >> ch;
    prova.push(ch);
} 
catch (wrong_insert& k) {
    k.allert();
};

这是推送功能:

template <class t>
void queue<t>::push(const t& entry)
{
    if(*I need this condition*) throw wrong_insert();
    if(empty())
    {
        head_insert(front_ptr, entry);
        rear_ptr = front_ptr;
    }
    else
    {
        insert(rear_ptr, entry);
        rear_ptr = rear_ptr->link();
    }
    ++count;
    cout << "Inserted!" << endl;
}

这是异常类:

class wrong_insert
{
public:
    wrong_insert() : message("Wrong data inserted!"){};
    void allert(){ cout << message;};
private:
    string message;
};

【问题讨论】:

  • 输入验证不应等于异常,您应该在解析 IMO 时进行验证。
  • @RickyMutschlechner 不,它没有。 RTTI(即获取变量的类型信息)与检查用户输入的语义无关。
  • C++ 是静态强类型的。传递不同类型的对象的唯一方法(没有疯狂的强制转换,在这种情况下你无能为力)将传递一个派生类型。由于您按值存储对象(我假设),因此您将通过切片创建正确类型的新对象。所以检查似乎非常是多余的。
  • 您的用例也毫无意义,因为在类型提升期间 char 将被隐式转换为 int,因此您的函数只会看到 int。

标签: c++ class exception queue


【解决方案1】:

我想将此添加为评论,但它不允许我这样做,因为我还没有 50 名声望。

我认为如果类型错误,它首先不会编译。

【讨论】:

    【解决方案2】:

    如果我理解你的问题,你问的是如何检查没有人试图将整数插入你的 chars 队列。

    答案是你不能,也不需要在运行时这样做。由于 C++ 是一种强类型语言,因此您将无法编译数据类型不兼容的代码。完全允许将 char 转换为 int 并且不会产生错误,但将 int 作为 char 传递可能会根据情况触发错误/警告。

    但是请注意,在某些情况下,如果 (a) 使用强制转换专门要求它,或者 (b) 如果编译器可以知道整数的值足够小,则允许您将整数传递给 char适合一个字符。这发生在编译时。 (注意根据您的 C++ 版本,这种自动转换可能会给您一个警告或错误,因此请注意您的警告。)

    如果您打算将此队列与相互继承的类一起使用,那么您的问题就变得更加相关,因为您可以将派生类型的对象作为引用或基类类型的指针传递。在这里,您可以使用typeid 运算符,但要知道这会触发 RTTI(运行时类型识别)并用一些额外的代码混淆您的可执行文件。

    C++ 就是“只有在使用时才付费”,如果你需要它(并且性能不会受到太大影响),就使用它。

    【讨论】:

    • 这不是 THAT 太多额外的代码或空间。每个类一个表,并通过间接调用函数指针。隐含的intchar 对我来说是新闻,应该只适用于constexpr。这是非常非常罕见的。
    • @StoryTeller 是的,这应该只适用于 constexpr,我认为它也适用于编译器知道的常量,但我可能会误认为/实现依赖于那个。
    • 好吧,你在这里制造了一个虚假的伪装。这不是什么太大的成本。对动态调度的任何类型的支持都会产生成本,这是开始编程 OO 的代价。而且 c++ 在频谱上相当低,当它被要求产生任何成本时,它确实产生了成本。这种对 C++ 对继承和覆盖的支持的强烈反对是上个世纪的事了。
    • 很公平,我会调低一点;)
    猜你喜欢
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2017-12-16
    相关资源
    最近更新 更多