-2

仅当满足其构造函数中的某些条件时,我才想创建结构的实例。如果不满足这些条件,我不想创建实例。不确定这是否可能,如果不是,那么另一种方法是什么?

Class Consumer
{




struct SampleStruct
            {
                MyClass     *   m_object;

                RoutingItem()
                {
                    m_object            = NULL;
                }
                MyClass(std::string name)
                {
                        if (! ObjSetting()->GetObj(name, m_object))//this function is supposed to populate m_object, but if it fails, I dont want to create this instance
                            return; //I dont want to create this object if GetObj() returns a false             

                }
            };



std::vector<SampleStruct> m_arrSample;

void LoadSettings(std::string name)
{

SampleStruct * ptrS;

SampleStruct s(name);


//I tried following two lines but it did'nt work. SO looks like returning from struct constructor still creates the instance
ptrS = &s;
if (!ptrS)
return;

m_arrSample.push_back(s);//only insert in vector if sampleStruct was successfully created


}




}
4

4 回答 4

4

您会考虑从构造函数内部抛出异常作为解决方案吗?如果不是这样,那是不可能的。另一种方法是使用工厂方法检查条件并决定是否需要创建对象。

这是第二种解决方案的一个简单示例:

struct A{
};

A* factoryPtr(bool build){
    if(build)
        return new A;
    return nullptr;
}

A factoryRef(bool build){
    if(not build)
        throw 0;
    return A();
}
于 2013-07-25T14:35:08.173 回答
1

不要这样做。

寻找替代设计。构造函数旨在构造对象,而不是决定它是否构造它。

不要试图违反语言规则进行编程。

于 2013-07-25T15:42:22.990 回答
1

我认为您可以定义一个创建函数来构造实例,

test* createInstance(string name)
    {
        if(conditon )
            return new test();
        else
            return nullptr;
    }
于 2013-07-25T14:40:55.020 回答
0

要么使用异常(如 Stefano 所说),要么使用工厂函数(如 minicaptain 所说)。

这两个版本看起来像这样:

#include <stdexcept>
#include <memory>

struct ExceptionStyle {
    std::unique_ptr<int> m_object;

    ExceptionStyle(std::string const &name) {
        if (name == "good")
            m_object.reset( new int(42) );
        else
            throw std::runtime_error(name);
    }
};
void save(ExceptionStyle*) {} // stick it in a vector or something

class FactoryStyle {
    std::unique_ptr<int> m_object;

    FactoryStyle() : m_object(new int(42)) {}

public:
    static std::unique_ptr<FactoryStyle> create(std::string const &name) {
        std::unique_ptr<FactoryStyle> obj;
        if (name == "good")
            obj.reset( new FactoryStyle );
        return obj;
    }
};
void save(std::unique_ptr<FactoryStyle>) {} // stick it in a vector or something

可以如下使用:

void LoadSettings(std::string const &name) {

    // use the exception style
    try {
        ExceptionStyle *es = new ExceptionStyle(name);
        // if we reach here, it was created ok
        save(es);
    } catch (std::runtime_exception) {}

    // use the factory style
    std::unique_ptr<FactoryStyle> fs = FactoryStyle::create(name);
    if (fs) {
        // if we reach here, it was created ok
        save(fs);
    }
}

异常是在构造实例的情况下将控制权转移到构造函数之外的唯一方法。因此,另一种方法是先检查您的状况。

于 2013-07-25T15:36:18.193 回答