对象没有被构造

时间:2013-01-09 21:58:53

标签: c++ object operator-overloading construction

我注意到这个奇怪的行为/错误,在初始化实际对象之前,类方法被称为。我有一个包装器对象,它有operator->()方法。现在,当我使用operator->()方法将对象作为构造函数中的构造函数参数传递给另一个对象时,实际的包装器对象不会被构造,而只是运行operator->()方法。 / p>

由于实际的代码示例非常复杂并且取决于许多其他内容,我只会展示可能无法正确编译的C ++代码段:

template<typename T>
class wrapper_object_type
{
public:
    wrapper_object_type() {/*does not run*/}
    T* operator->() {/*does run*/}
};
class bad_behaviour
{
public:
    bad_behaviour() : another_object(wrapper_object->t_object) 
    {/*crashes(0xccc access violation*/}
};

标准中是否有定义可能允许此类行为的内容?或者更确切地说,是否有一些隐含的构造等可以绕过默认构造?

2 个答案:

答案 0 :(得分:2)

可能在初始化之前使用wrapper_object。成员变量的构造顺序与它们在类中声明的顺序相同,因此请确保在wrapper_object之前声明another_object

(假设wrapper_objectanother_objectbad_behaviour的成员变量,但没有更合理的代码示例,很难说。)

答案 1 :(得分:0)

嗯,我做到了硬道;我将对象从堆栈切换到堆,并通过new关键字而不是初始化列表显式初始化它们。正如我所想,这并没有重现奇怪的行为,所以它按预期工作。我现在想的是,它实际上可能是一个编译器错误,因为我通过初始化程序列表的方式类似于我如何解决问题。唯一改变的是我之前没有在堆中分配它们的事实。

我还尝试提供可以重现错误的工作代码,但是那里没有显示错误。这可能是因为注意到bug的实际代码非常依赖于模板类型和包装器对象。由于它现在可以在堆中分配对象时使用,因此错误不在代码中,而是在编译器中。