2011-11-25 59 views
0

这是两个问题之一:-D。在对象构造函数和成员函数中使用const的C++

我在尝试使用const时遇到了一对编译错误。

我正在努力实现的目标。

在我的类构造函数中,我将一个指针传递给一个对象。我不想改变对象的地址和值,所以我使用const。这里是我的代码看起来像

类的构造函数

A::A(const B* const example): m_example(example) { 

     m_mth1_ex = m_example->method1(); 
     m_mth2_ex = m_example->method2(); 

} 

在类的头文件,我收到

C* const m_mth1_ex; 
D* const m_mth2_ex ; 

错误:

error: uninitialized member 'A::m_mth1_ex' with 'const' type 'C* const' 
error: uninitialized member 'A::m_mth2_ex' with 'const' type 'D* const' 
error: assignment of read-only data-member 'A::m_mth1_ex' 
error: assignment of read-only data-member 'A::m_mth1_ex'  

我想,既然我初始化在构造函数中这些值是正常的,但我想我在头文件中声明它们,const不像那样...

其次,来自B类的方法不返回const对象吗?

最后,由于方法来自B类,它有一个常量值,地址会不会改变这些方法?

回答

2

您还没有初始化这些值,你是因为您不能将值分配给常量(只读)变量,因此将它们分配给它们和编译器投诉。你必须使用构造函数的初始化列表来初始化类成员。例如:

A::A (const B *const example) 
    : m_example (example) 
    , m_mth1_ex (m_example->method1()) 
    , m_mth2_ex (m_example->method2()) 
{ 
} 

另外,因为成员声明的顺序很重要,所以您必须小心并注意初始化的顺序。基本上,如果你在类m_mth1_ex之后声明m_example,这个代码将会是未定义的行为,因为m_mth1_ex会先被初始化,即使它出现在初始化列表中第二个。

在这个特殊的例子,它是安全写:

A::A (const B *const example) 
    : m_example (example) 
    , m_mth1_ex (example->method1()) 
    , m_mth2_ex (example->method2()) 
{ 
} 

要记住的初始化列表和一般构造另一个重要的事情 - 如果异常在构造函数中抛出,该对象的析构函数不叫。所以,如果你的method1()method2()调用分配内存,那么这个代码是坏的,因为一旦抛出example->method2(),你就丢失了一个由example->method1()分配的指针并且有内存泄漏。除非m_mth1_exm_mth2_ex是某种智能指针(即std::unique_ptr)。

+0

我相信我会在构造函数中遇到这个问题。我将需要重载新操作符,或者更好地使用智能指针,如您所说:-D – MWright

3

你很困惑初始化转让。前者是好的,后者不是。

使用初始化正确:

A::A(const B* const example) 
: m_example(example), 
    m_mth1_ex(m_example->method1()), 
    m_mth2_ex(m_example->method2()) 
{ 
} 

(你甚至可能更愿意使用example->method1()从成员变量的任何特定声明顺序脱钩自己)

0

const成员必须在初始化列表被初始化,所以这意味着你必须这样做:

A::A(const B* const example) 
: m_example(example), 
    m_mth1_ex = m_example->method1(), 
    m_mth2_ex = m_example->method2() 
{ 
} 

但是,现在你已经打开了蠕虫的一个巨大的可相对于订单OF-初始化和可维护性。按照声明的顺序初始化成员,而不管你按照你写的代码初始化它们的顺序。因此,如果m_meth1_exm_example之前宣布,m_meth1_ex将首先被初始化。

上述方法可行 - 但您的代码中可能存在设计缺陷。我会着眼于提出一个更好的设计。