繁体   English   中英

C ++异常和处理

[英]C++ Exceptions and handling

我是用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

当我构建项目时,我得到错误消息:无法直接调用构造函数'NoMarkException :: NoMarkException'为什么会导致此问题?

if (marks.empty()) {
    throw NoMarkException();
}

您得到的错误实际上与您使用异常类无关。 问题是您试图通过显式调用(默认)构造函数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()

叫做 (*)。

在您的情况下,您只需要用NoMarkException对象的实例NoMarkExceptionthrowNoMarkException::NoMarkException()的显式调用,即您的语句将是:

throw NoMarkException();

(*)-实际上,被调用的向量构造函数还有更多的参数,这些参数采用其默认值。 这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM