【问题标题】:C++ Exceptions and handlingC++ 异常和处理
【发布时间】:2017-06-02 07:55:41
【问题描述】:

我是使用 c++ 编写异常的新手,我正在努力解决一个错误。我不会详细介绍,因为我认为这与我遇到的问题无关。

#ifndef _STUDENT_H_
#define _STUDENT_H_
#include <string>
#include <map>
#include <vector>
#include <stdexcept>
#include <iostream>
class NoMarkException: public exception
{
public: NoMarkException():exception(){
        cout<< "No marks were found." << endl;
    }/*
    NoMarkException(const string &name){
    cout << "No marks for " << name << " were found."<< endl;
    }*/
};
#endif

这是我的 NoMarkException 类

float Student::getMaxMark() const throw(NoMarkException) {
if (marks.empty()) {
    throw NoMarkException::NoMarkException();
}

float final = 0;

for (it = marks.begin(); it != marks.end(); it++) {
    if ((*it).second > final) {
        final = (*it).second;
    }
}

return final;
}

这是我的 Student.cpp

当我构建项目时,我得到 error: cannot call constructor 'NoMarkException::NoMarkException' directly 任何想法为什么会导致问题?

【问题讨论】:

  • 在没有“NoMarkException::”的情况下重试。
  • 附注。名称以下划线开头,后跟大写字母保留给实现。而且我们不再使用异常规范。
  • throw() 异常规范有点过时了;试试noexcept

标签: c++ exception constructor


【解决方案1】:
if (marks.empty()) {
    throw NoMarkException();
}

【讨论】:

    【解决方案2】:

    您得到的错误实际上与您使用异常类的事实没有任何关系。问题是您试图通过显式调用(默认)构造函数NoMarkException::NoMarkException() 来实例化类NoMarkException 的对象。在 C++ 中,您不会显式调用构造函数;相反,当您定义一个新变量时,会调用一个适当的构造函数。例如

    void foo() {
        std::vector<int> v(5);
        NoMarkException my_exception();
        NoMarkException my_other_exception();
    }
    

    或者,由于最近的语言变化,使用等效但更合适的方法:

    void foo() {
        std::vector<int> v { 5 };
        NoMarkException my_exception { };
        NoMarkException my_other_exception { };
    }
    

    在这种情况下(两种语法选择),构造函数:

    std::vector<int>::vector(std::vector<int>::size_type count)
    NoMarkException::NoMarkException()
    NoMarkException::NoMarkException()
    

    被称为 (*)。

    在您的情况下,您只需将 throw 中对 NoMarkException::NoMarkException() 的显式调用替换为 NoMarkException 对象的实例化,即您的语句将是:

    throw NoMarkException();
    

    (*) - 实际上,被调用的向量构造函数还有一些参数,它们采用默认值。见here。

    【讨论】:

      猜你喜欢
      • 2011-10-12
      • 2012-05-04
      • 2012-06-11
      • 2011-04-27
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多