2013-09-22 42 views
6

Tôi bị kẹt với sự cố C++. Tôi có một lớp cơ sở có một con trỏ đối tượng tự tham chiếu bên trong vùng hiển thị riêng của lớp. Tôi có một hàm tạo trong lớp cơ sở để khởi tạo hai con trỏ này. Bây giờ tôi có lớp dẫn xuất của tôi có specifier truy cập là riêng tư (tôi muốn làm cho các hàm thành viên công khai của lớp cơ sở riêng của tôi). Bây giờ thông qua các hàm thành viên của lớp dẫn xuất của tôi, tôi muốn tạo một con trỏ đối tượng có thể trỏ đến dữ liệu riêng tư của lớp cơ sở, đó là các con trỏ đối tượng tự tham chiếu. Mã của tôi là:Làm cách nào để tạo một lớp dẫn xuất truy cập dữ liệu thành viên riêng tư?

class base{ 
private: 
    base *ptr1; 
    int data; 
public: 
    base(){} 
    base(int d) { data=d } 
}; 

class derived:private base{ 
public: 
    void member() 
}; 

void derived::member() 
{ 
base *temp=new base(val); //val is some integer 
temp->ptr1=NULL; //I can't make this happen. To do this I had to declare all the 
       //private members of the base class public. 
} 
+8

Sử dụng 'protected' thay vì' private'? –

+4

Thực hiện lệnh getter 'protected' cho thành viên' private'? Thông thường, thiết kế của bạn là thiếu sót nếu bạn cần các giải pháp như vậy. –

+0

Điều đó không hoạt động. Lỗi trình biên dịch. Cố gắng đó là tốt. Chỉ bằng cách công khai nó, tôi có thể truy cập nó. Nhưng điều đó sẽ làm cho mã dễ bị tổn thương. –

Trả lời

11

Lớp có nguồn gốc không thể truy cập thành viên riêng của lớp cơ sở. Không có loại thừa kế nào cho phép truy cập vào các thành viên riêng tư.

Tuy nhiên, nếu bạn sử dụng tuyên bố friend, bạn có thể thực hiện điều đó.

+0

Tôi biết điều đó nhưng không có cách nào để làm điều đó. Lựa chọn duy nhất khác là sử dụng các lớp bạn bè. Nhưng tôi muốn giải quyết vấn đề bằng cách sử dụng thừa kế. –

+3

Bạn có thể sử dụng friendartartion !!! hoặc sử dụng tốt hơn được bảo vệ thay vì riêng tư :) –

4

Không có cách nào khác để truy cập dữ liệu riêng tư của lớp khác rồi đến tình bạn. Tuy nhiên, những gì bạn có thể làm với kế thừa là truy cập dữ liệu được bảo vệ của lớp cơ sở. Nhưng nó không có nghĩa là bạn có thể truy cập dữ liệu được bảo vệ của một đối tượng khác của kiểu cơ sở. Bạn chỉ có thể truy cập được bảo vệ dữ liệu của phần cơ sở của lớp được thừa kế:

class base{ 
protected: //protected instead of private 
    base *ptr1; 
    int data; 
public: 
    base(){} 
    base(int d) { data=d; } 
}; 

class derived:private base{ 
public: 
    void member(); 
}; 

void derived::member() 
{ 
    base *temp=new base(3); 
    //temp->ptr1 = 0; //you need friendship to access ptr1 in temp 

    this->ptr1 = 0; // but you can access base::ptr1 while it is protected 
} 

int main(){} 
+0

Cảm ơn sự giúp đỡ –

2

cố gắng cung cấp bảo vệ như specifier truy cập trong lớp cơ sở và kế thừa các lớp cơ sở trong chế độ riêng ..... nhưng đối với tiếp tục sử dụng các hàm thành viên của lớp cơ sở u có thể cần vài hàm nội tuyến ngắn vì chúng cũng sẽ được chuyển đổi thành riêng tư

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