gpt4 book ai didi

c++ - 使用异常抛出构造函数初始化对象的正确方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:13 30 4
gpt4 key购买 nike

这似乎是一个微不足道的问题,但我现在已经挂了几个小时(也许太多的 Java 扼杀了我的 C++ 脑细胞)。

我创建了一个具有以下构造函数的类(即没有默认构造函数)

VACaptureSource::VACaptureSource( std::string inputType, std::string inputLocation ) {
if( type == "" || location == "" ) {
throw std::invalid_argument("Empty type or location in VACaptureSource()");
}
type = inputType;
location = inputLocation;

// Open the given media source using the appropriate OpenCV function.
if( type.compare("image") ) {
frame = cvLoadImage( location.c_str() );
if( !frame ) {
throw std::runtime_error("error opening file");
}
}
else {
throw std::invalid_argument("Unknown input type in VACaptureSource()");
}

当我想创建一个实例时,我使用

    // Create input data object
try {
VACaptureSource input = VACaptureSource("image", "/home/cuneyt/workspace/testmedia/face_images/jhumpa_1.jpg");
}
catch( invalid_argument& ia ) {
cerr << "FD Error: " << ia.what() << endl;
usage(argv[0]);
}
catch( runtime_error& re ) {
cerr << "FD Error: " << re.what() << endl;
usage(argv[0]);
}

但是,在这种情况下,实例是该 block 的本地实例,我无法在其他任何地方引用它。另一方面,我不能说

VACAptureSource input;

在程序的开头,因为没有默认构造函数。

正确的做法是什么?

谢谢!

最佳答案

为什么需要在 try block 之外引用它?

代替

try {
VACaptureSource input = VACaptureSource("image", "/home/cuneyt/workspace/testmedia/face_images/jhumpa_1.jpg");
}
//catch....

//do stuff with input

您可以将所有内容移至 try block 中:

try {
VACaptureSource input = VACaptureSource("image", "/home/cuneyt/workspace/testmedia/face_images/jhumpa_1.jpg");
//do stuff with input
}
//catch....

或者您可以将其分解为一个单独的函数,该函数从 try block 中调用:

void doStuff(VACaptureSource& input){
//do stuff with input
}

try {
VACaptureSource input = VACaptureSource("image", "/home/cuneyt/workspace/testmedia/face_images/jhumpa_1.jpg");
doStuff(input);
}
//catch....

最后一个甚至为您提供了将构造与使用分开的好处,它可以很好地放入单元测试中,您可能希望该函数改为在模拟对象上工作。

关于c++ - 使用异常抛出构造函数初始化对象的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1064248/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com