2012-06-20 9 views
5

Tôi muốn biết nếu chúng cơ bản là giống nhau.Chuyển các tham chiếu đến một hàm dựng C++ và lưu chúng vào các loại tham chiếu hoặc không tham chiếu

class ExampleClass { 
    public: 
     ExampleClass(Object& newObj) : obj(newObj) {} 
    private: 
     Object obj; 
} 

class ExampleClass2 { 
    public: 
     ExampleClass2(Object& newObj) : objReference(newObj) {} 
    private: 
     Object& objReference; 
} 

Vì vậy, điều này sẽ không hoạt động với một trong các lớp học?

ExampleClass* getExampleObject() { 
    Object obj; 
    return new ExampleClass(obj); 
} 

ExampleClass2* getExample2Object() { 
    Object obj; 
    return new ExampleClass2(obj); 
} 

void main() { 
    ExampleClass* ec = getExampleObject(); 
    ExampleClass2* ec2 = getExample2Object(); 
    //Do something involving the member objects of ec and ec2 
} 

Vì vậy, các đối tượng thành viên không hợp lệ sau cả hai phương thức getExampleObject? Không phải là constructor của ExampleClass lưu một bản sao của đối tượng được tham chiếu trong constructor của nó?

+1

mã của bạn không biên dịch, vì bạn không thể gán con trỏ (như được trả về bởi getExampleObject và getExample2Object) thành biến không trỏ ec và ec2. – SirDarius

+0

Vâng, tôi xin lỗi, tôi quên mất *. – user1468729

Trả lời

8

ExampleClass là tốt, vì nó cần một bản sao của đối tượng được tham chiếu trong đối số hàm tạo của nó.

ExampleClass2 yêu cầu đối tượng được tham chiếu trong đối số hàm tạo của nó tồn tại suốt đời của cá thể ExampleClass2 (vì nó lưu trữ tham chiếu đến đối tượng, nó không sao chép đối tượng). Nếu không, trường hợp ExampleClass2 sẽ có tham chiếu treo lơ lửng ngay khi đối tượng được đề cập bị hủy. Đây là trường hợp có chức năng getExample2Object()obj bị hủy khi số tiền trả về là getExample2Object().

+1

Cảm ơn. Đó là những gì tôi nghĩ nhưng điều này làm tôi nghi ngờ bản thân mình: [link] (http://stackoverflow.com/questions/1404305/c-reference-in-constructor) – user1468729

+0

@ user1468729, trong câu hỏi đó 'myclass' có' std :: string' thành viên, không phải là một tham chiếu đến một 'std :: string'. – hmjd

+0

Vì vậy, ExampleClass đầu tiên của tôi. Hay tôi đang thiếu thứ gì đó ở đây? – user1468729

0

Tôi muốn biết nếu đây là về cơ bản giống nhau.

Không, chúng không có. Phương thức khởi tạo của đối tượng Example lấy một đối tượng tham chiếu và xây dựng một đối tượng thành viên để sử dụng đối tượng được truyền. Đối tượng này không phải là một tham chiếu mà là một bản sao. Trong trường hợp của Example2, bạn đang thực sự làm cho objReference tham chiếu đến đối tượng được truyền trong tham số của ctor. Bạn chỉ tốt miễn là đời của newObj.

Các

Object obj; 
return new ExampleClass2(obj); 

là trường hợp cổ điển khi nó sẽ thất bại. Khi hàm trả về, bạn sẽ có một tham chiếu treo lơ lửng.