我试图在两种实例化对象和处理对我的程序至关重要的对象的构造函数异常之间做出决定,即如果构造失败,程序就无法继续.
我有一个包含基本Win32 MIDI功能的SimpleMIDIOut类.它将在构造函数中打开一个MIDI设备,并在析构函数中将其关闭.如果无法打开MIDI设备,它将在构造函数中抛出从std :: exception继承的异常.
捕获此对象的构造函数异常的以下哪种方法更符合C++最佳实践
方法1 - 堆栈分配的对象,仅在try块内的范围内
#include <iostream>
#include "simplemidiout.h"
int main()
{
try
{
SimpleMIDIOut myOut; //constructor will throw if MIDI device cannot be opened
myOut.PlayNote(60,100);
//.....
//myOut goes out of scope outside this block
//so basically the whole program has to be inside
//this block.
//On the plus side, it's on the stack so
//destructor that handles object cleanup
//is called automatically, more inline with RAII idiom?
}
catch(const std::exception& e)
{
std::cout << e.what() …Run Code Online (Sandbox Code Playgroud) 我刚刚完成了Koenig&Moo的Accelerated C++,在第13章和第14章中,他们列出了一些Handle类的想法和实现(简单,共享,引用计数).
这些类包含一个原始指针,并从客户端代码中抽象出动态对象的分配/释放,以避免原始指针的所有危险,同时允许用户取消引用它们以访问指向的对象.基本上是一种与原始内存资源接口的"更安全"方式.
这些章节中介绍的类是否基本上是智能指针的实现?智能指针对我来说仍然是一个新手,但据我所知,这些Handle类正在执行相同的功能.
编辑
我应该补充一点,他们在这些章节中开发的类是模板类,因此它们不受特定资源的约束,例如,他们没有设计特定的FileHandle类.
这里的第一个代码片段7.1 中的代码几乎就是他们在我所指的章节中得到的代码.
我正在按照上一个问题的回复中提出的方式实现Factory类:
它是一个Factory,它存储从字符串到对象创建函数的映射,因此我可以通过字符串标识符从工厂请求不同类型的对象.这个工厂生成的所有类都将继承自一个抽象类(Connection),为不同协议(HTTPConnection,FTPConnection等)的连接提供通用接口.
我很好地掌握了与上述方法相关联的方法是如何运作的.
我遇到问题的地方是试图找出一种机制来防止在不使用Factory的情况下实例化Connection对象.为了使Factory能够完成它的工作,我需要为它提供一个对象创建函数来存储它的地图.我不能提供它的构造函数,因为你不能创建构造函数的函数指针.因此,如上面的链接,必须有一个单独的对象创建函数来返回新对象.但要做到这一点,我需要使这个创建函数或者是类的静态方法,客户端代码能够访问它,或者是一个单独的函数,它需要a)Connection类的构造函数是公共的,或者b)使构造函数成为私有,并使非类成员创建函数成为朋友,这不是继承的,可以'
类似地,如果我只是使用Connection类生成Factory类的朋友,那么它应该生成所以它可以访问它们的私有构造函数,这样可以工作,但是我无法通过abstact基类强制执行,因为朋友不是继承的.每个子类都必须明确地与Factory成为朋友.
任何人都可以建议实施我上面描述的方法吗?
重申要求:
1 - 生成各种对象的工厂,所有对象都基于传入的标识符从相同的基类派生到Factory的Create方法.
2 - 工厂需要生成的所有子类将自动向工厂注册创建函数和标识符(参见上面链接的SO答案)
3 - 工厂生产的所有子类都不应该是可实例化的(可实例化的?)而不经过工厂
4 - 使用继承将#3显式强制作为抽象基类的一部分.删除了某人从抽象基类继承子类的可能性,同时还提供了自由实例化对象的机制.
我想要实现的总体目标是允许将新的Connection类型添加到层次结构中,而不必以任何方式更改Factory类,同时还强制Connection的所有子类不能通过客户端代码直接实例化.
我很乐意这可能不是实现我想要的最佳方式,欢迎其他替代方案的建议.
编辑 - 当我回到家时希望能够更清楚地添加一些代码片段.
我正在学习设计模式,我注意到在Observer模式的几乎所有示例实现中都注意到在Subject的register/unregister方法中没有任何错误处理.这让我想知道如何做到这一点.
如何专门处理错误将取决于应用程序的需求,但处理这种错误的常见方法是什么?
例如,我尝试注册观察者但注册失败.该错误是否只是默默地发生,并且该特定观察者不会获得更新是可以接受的?主题是我猜的更聪明,并且可以继续通知观察者DID成功注册.
我注意到我有时很难判断一个程序中错误检查的程度是多少,并想知道这是否是我在考虑每一个意外情况的情况之一.
我想使用Boost Test在Visual Studio 2010中对我的代码进行单元测试.我已经下载并构建了最新版本的库.
我在这里和互联网上的其他地方已经阅读了很多关于这个主题的内容,人们似乎建议在你的解决方案中为你的测试提供第二个项目.
很好,听起来不错.但是我实际上没有设置它.我还没有找到解决这个问题的最佳方法的明确解释.
我是否需要使用项目参考来使我的单元测试项目参考我的主项目?如果是这样,我还需要在我的单元测试项目的属性中添加主项目的Include&Source目录吗?如果是这样,首先使用项目参考有什么好处?
我是否必须让我的主项目输出一个库以供我的单元测试项目链接?再一次,我认为项目参考会使这不必要,但似乎我并不真正理解项目参考.
如果可能的话,我可以获得一个非常白痴的证据,一步一步的程序,在VS2010的主要项目旁边设置一个Boost测试单元测试项目?
我会更好地使用这里列出的方法(一个项目,构建测试或实际项目exe的不同配置):http: //blog.yastrebkov.com/2010/07/boost-test-setup-and-usage html的
非常感谢,