相关疑难解决方法(0)

使用断言或例外通过合同设计?

通过合同编程时,函数或方法首先检查其前提是否已满足,然后才开始履行其职责,对吗?两个最重要的方式做这些检查是通过assertexception.

  1. 断言仅在调试模式下失败.确保(单元)测试所有单独的合同前提条件以确定它们是否确实失败是至关重要的.
  2. 在调试和释放模式下异常失败.这样做的好处是,测试的调试行为与发布行为相同,但它会导致运行时性能下降.

你觉得哪一个更好?

请参阅此处的相关问题

assert design-by-contract exception

121
推荐指数
5
解决办法
2万
查看次数

在C++中初始化动态数组的正确方法

我目前正在开发一个C++项目,其中经常出现动态数组.我想知道,使用new-operator初始化动态数组的正确方法是什么?我的一位同事告诉我,在构造函数中使用new是一个禁忌,因为构造函数是一个不应该容易出错或者根本不应该失败的构造.现在让我们考虑以下示例:我们有两个类,一个或多或少复杂的类State和一个StateContainer类,应该自我解释.

class State {
private:
 unsigned smth;
public:
 State();
 State( unsigned s );
};

class StateContainer {
private:
 unsigned long nStates;
 State *states;
public:
 StateContainer();
 StateContainer( unsigned long n );
 virtual ~StateContainer();
};

StateContainer::StateContainer() {
 nStates = SOME_DEFINE_N_STATES;
 states = new State[nStates];
 if ( !states ) {
  // Error handling
 }
}

StateContainer::StateContainer( unsigned long n ) {
 nStates = n;
 try {
  states = new State[nStates]
 } catch ( std::bad_alloc &e ) {
  // Error handling
 }
}

StateContainer::~StateContainer() …
Run Code Online (Sandbox Code Playgroud)

c++ new-operator

7
推荐指数
2
解决办法
5735
查看次数

如何处理传递给构造函数的语法有效但逻辑无效的参数?

我需要创建一个具有这样的公共接口的类Expr:

class Expr{
    //...
public:
   Expr(const char*);
   int eval();           //Evaluates the expression and gives the result
   void print();
};
Run Code Online (Sandbox Code Playgroud)

在设计中,如果用户输入无效字符串来构造Expr对象,如"123 ++ 233 + 23/45",那么最初构造Object并在对该对象调用eval()时通知错误是否正确.

或者应该在该点检查错误本身并抛出异常,但这会导致运行时严重增加.并且用户可以编写代码,并假设创建了Object,并且仅在运行时发现错误.

这样的问题总是在创建一个类时出现,是否有一种相当标准的方法来处理用户的这些错误?

c++ error-handling class

5
推荐指数
2
解决办法
476
查看次数