2012-04-21 29 views
6

ví dụ đơn giản này cho thấy C++ Cú pháp để gọi constructor của lớp cha - như xa như tôi hiểu nó như là một C++ học:C++: Gọi một constructor lớp cơ sở với một đối số tính

class BaseClass { 
protected: 
    int i; 
public: 
    BaseClass(int x) { 
    i = x; 
    } 
}; 

class DerivedClass: public BaseClass { 
    int j; 
public: 
    DerivedClass(int x, int y): BaseClass(y) { 
    j = x; 
    } 

Ở đây, lớp cơ sở constructor có thể lấy các đối số được đặt tên cho hàm tạo lớp dẫn xuất như đầu vào.

Bây giờ, điều gì sẽ xảy ra nếu tôi muốn gọi hàm tạo BaseClass() với giá trị đầu vào không phải là đầu vào trực tiếp cho DerivedClass()? Về cơ bản, tôi muốn thực hiện một số công việc nhiều lần với xy trong phạm vi DerivedClass(), sau đó chuyển giá trị được tính đến BaseClass(). Điều này có thể được thực hiện với các nhà thầu? Điều này có nên được thực hiện với một số loại phương pháp khởi tạo thay thế?

Trả lời

11

Bạn có thể làm điều đó, vâng:

class BaseClass 
{ 
    public: 
    BaseClass(int x) : i(x) {} 

    private: 
    int i; 
}; 

class DerivedClass: public BaseClass 
{ 
    public: 
    DerivedClass(int x, int y): 
     BaseClass(compute(x, y)), // Neither i or j are initialized here yet 
     j(x) 
     {} 

    private: 
    static int compute(int a, int b) { return a + b; } // Or whatever 
    int j; 
}; 

Lưu ý rằng bạn thậm chí có thể làm cho compute() một phương pháp không tĩnh nhưng lưu ý rằng DerivedClass hoặc BaseClass thành viên sẽ không được khởi tạo tại thời điểm gọi điện. Vì vậy, bạn sẽ không thể dựa vào giá trị của chúng.

+0

@Seth Carnegie: Cảm ơn sự mất tích ' ; 'fix: DI đoán tôi đã làm quá nhiều Python gần đây. – ereOn

2

Sau đó, bạn có thể làm điều này:

DerivedClass(int x, int y): BaseClass(compute(x,y)), j(y) { 
    //j = x; //use member-initialization-list ---> ^^^^ 
    } 

int compute(int x, int y) 
{ 
    //your code 
} 
3

Nếu bạn đang sử dụng C++ 11 hoặc mới hơn, bạn cũng có thể sử dụng biểu thức lambda:

class BaseClass 
{ 
    public: 
    BaseClass(int x) : i(x) {} 

    private: 
    int i; 
}; 

class DerivedClass: public BaseClass 
{ 
    public: 
     DerivedClass(int x, int y): BaseClass(
      [=]()->int 
      { 
       int sum = 0; 
       for(int i = 0; i < x; ++i) 
       { 
        sum += y + i * x; 
       } 
       return sum; 
      }()), j(x) 
     {} 

    private: 
    int j; 
}; 
+1

+1 cho lời nhắc rằng có lambda tồn tại. Nhưng nó sẽ không tốt nếu tính toán quá lớn. Nó làm cho khó khăn để đọc các nhà xây dựng (IMHO). – Nawaz

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