2012-07-20 43 views
5

này mẫu mã của tôi:Gọi hàm tạo của lớp khác thông qua danh sách Khởi tạo. Có vấn đề

#include <iostream> 
using namespace std; 

class Base 
{ 
public: 
    Base (int v, char z) {x=v;y=z;}; 
    int x; 
    char y; 
}; 

class Bar 
{ 
public: 
    Bar(int m, char n):q(m),s(n),base(q,s){}; 
    Base base; 
    int q; 
    char s;  
}; 

int main() 
{ 
    Bar barObj(5,'h');  
    cout << barObj.base.x << barObj.base.y << endl;  
    return 0; 
} 

Tại sao tôi lại nhận được một sản lượng 0? http://ideone.com/pf47j

Ngoài ra, nói chung, phương pháp đúng để tạo ra một đối tượng thành viên trong lớp khác và gọi constructor của đối tượng đó là gì, như đã làm ở trên với cơ sở đối tượng của class Base, bên class Bar?

+0

'Base base;' không 'Base base (int v, char z);'. Đọc một cuốn sách thích hợp. –

+0

Mã trong liên kết của bạn khác với mã bạn có trên – mathematician1975

+0

Ngoài những gì Cat Plus Plus đã nói, bạn cần sử dụng 'm' và' n'. 'q' và' s' chưa được khởi tạo trước khi xây dựng 'base'. – IronMensan

Trả lời

6

Thứ tự khởi tạo của các thành viên dữ liệu tuân theo thứ tự khai báo của chúng, không phải thứ tự bạn liệt kê bộ khởi tạo của chúng. Do đó, Bar::base luôn được khởi tạo trước Bar::qBar::s.
Như được hiển thị trong http://ideone.com/M6iKR, cho Bar::Bar(int m, char n), khởi tạo base sử dụng mn hoạt động tốt.

+1

khi bạn sử dụng' m, n' thay vì 'q, s', thứ tự không quan trọng. –

+0

Cảm ơn tôi vừa chuyển tờ khai Bar :: base bên dưới q và s. – user1084113

Các vấn đề liên quan