C++ truyền đối tượng bằng cách tham chiếu đến hàm tạo

   main() {
      int i = 10, j = 20;
      swapThemByVal(i, j);
      cout << i << "  " << j << endl;     // displays 10  20
      swapThemByRef(i, j);
      cout << i << "  " << j << endl;     // displays 20  10
      ...
   }

   void swapThemByVal(int num1, int num2) {
      int temp = num1;
      num1 = num2;
      num2 = temp;
   }

   void swapThemByRef(int& num1, int& num2) {
      int temp = num1;
      num1 = num2;
      num2 = temp;
   }

Vấn đề của bạn là bạn không phân biệt giữa các đối tượng bình thường, tham chiếu và con trỏ. Trong Java, mọi thứ đều là một con trỏ, do đó không cần cú pháp khác. Trong C++ có một sự khác biệt lớn

Tạo một con trỏ trên heap. (nếu bạn không xóa nó ở cuối phạm vi mà nó được tạo, nó sẽ tiếp tục tồn tại)

DHT *dht = new DHT(PIN0, DHT22, 1); // this is a pointer

Tạo một đối tượng trên ngăn xếp. (bạn có thể xem đây là một biến cục bộ vì ngay sau khi phạm vi kết thúc, đối tượng của bạn sẽ tự động bị xóa)

DHT dht = DHT(PIN0, DHT22, 1); 

Đây là một con trỏ trỏ đến bộ nhớ đã được tạo với lệnh gọi trước đó, tôi. e. DHT dht =

DHT *dhtPointer = &dht; 

Sau đây là tham chiếu đến bộ nhớ được tạo trong cuộc gọi đầu tiên

DHT &dhtRef = dht;

Bạn thấy cú pháp có khác đúng không?

DHT *dht = new DHT(PIN0, DHT22, 1); // pointer
// sensor in the constructor below is just an object, not a pointer, while dht is a pionter
ClimateController(Relay relay, DHT sensor, float minValue, float maxValue); 

Thay vào đó, bạn cần truyền một đối tượng, không phải con trỏ, cho rơle và cảm biến. Hoặc bạn thay đổi hàm tạo của mình để lấy con trỏ

Tôi là một nhà phát triển Java và hiện tôi đang cố gắng học C++. Tôi rất mới với ngôn ngữ lập trình. Tôi đang cố chuyển các đối tượng tới một hàm tạo mà có vẻ như tôi đang làm sai

Một đối tượng tam giác cần chứa các tham chiếu đến 3 đối tượng "Vertex", là các điểm của tam giác

Tam giác. h

  1. #ifndef TRIANGLE_H_
  2. #define TRIANGLE_H_
  3. #include "Vùng. h"
  4. không gian tên hình học {
  5. lớp Tam giác {
  6. công cộng
  7. Đỉnh v1,v2,v3;
  8. Tam giác(Đỉnh và một, Đỉnh và hai, Vùng và ba);
  9. ảo ~Tam giác();
  10. };
  11. }
  12. #endif /* TRIANGLE_H_ */

Hình tam giác. cpp

  1. .
  2. Tam giác. Tam giác(Đỉnh và một, Đỉnh và hai, Vùng và ba) {
  3. v1 = một;
  4. v2 = hai;
  5. v3 = ba;
  6. }
  7. ...

Đỉnh. h

  1. #ifndef VERTEX_H_
  2. #define VERTEX_H_
  3. #bao gồm ". /đại số/Vector4f. h"
  4. #bao gồm ". /đại số/Matrix4f. h"
  5. sử dụng đại số không gian tên;
  6. không gian tên hình học {
  7. lớp Vertex {
  8. công cộng
  9. Vị trí Vector4f;
  10. Đỉnh(float x, float y, float z);
  11. float x();
  12. float y();
  13. float z();
  14. void transform(Matrix4f& m);
  15. ảo ~Vertex();
  16. };
  17. }
  18. #endif /* VERTEX_H_ */

Đoạn mã trên tạo ra lỗi "Tam giác. cpp. 13. 63. lỗi. không có chức năng phù hợp để gọi đến 'hình học. đỉnh. Vertex()' ghi chú. ứng cử viên là. hình học. đỉnh. Đỉnh (phao, thả nổi, thả nổi)",

trong số những người khác.
Giải thích của tôi là C++ cố gắng tạo các đối tượng đỉnh trong lời gọi tới Tam giác. Triangle(Vertex & one, Vertex & two, Vertex & three) chỉ với mã này, trong khi tôi chỉ muốn có một, hai và ba làm trình giữ chỗ cho các đối tượng được truyền khi tôi thực sự sử dụng hàm tạo, giống như tôi sẽ có trong java.

Như bạn có thể thấy, tôi hoàn toàn là người mới bắt đầu học C++.
Tôi đã làm gì sai?

Cảm ơn

6 Feb '11 #1

sử dụng danh sách trình khởi tạo hàm tạo.
Hình tam giác. Tam giác(Đỉnh và một, Đỉnh và hai, Đỉnh và ba) {
. v1(one)
, v2(two)
{
// phần còn lại của hàm tạo
..


11

C++ truyền đối tượng bằng cách tham chiếu đến hàm tạo
16786
C++ truyền đối tượng bằng cách tham chiếu đến hàm tạo

nó nói rằng dòng 2 của tam giác. cpp

  1. Hình tam giác. Tam giác(Vertex  &one, Vertex  &hai, Vertex  &ba) {

requires a default constructor for Vertex, e.g.

06 Feb '11 #2

Tôi biết, nhưng tôi không thể hiểu tại sao. Những gì tôi đang cố gắng làm ở đó là tạo một hàm tạo cho Tam giác lấy ba đối tượng Vertex làm tham số. Tôi thực sự không thấy việc có một hàm tạo mặc định cho một đỉnh có liên quan như thế nào

Tôi chọn chỉ cung cấp hàm tạo cho Vertex có tọa độ x,y,z -. Hàm tạo cho Tam giác không cần quan tâm đến điều này, nó chỉ nên chấp nhận bất kỳ ba đối tượng đỉnh nào tôi cung cấp cho nó khi tôi sử dụng nó, bất kể hàm tạo nào được sử dụng để tạo các đối tượng đỉnh.

Vậy tại sao nó không làm điều đó?

06 Feb '11 #3

sử dụng danh sách trình khởi tạo hàm tạo.
Hình tam giác. Tam giác(Đỉnh và một, Đỉnh và hai, Đỉnh và ba) {
. v1(one)
, v2(two)
{
// phần còn lại của hàm tạo
..

07 Feb '11 #4

C++ truyền đối tượng bằng cách tham chiếu đến hàm tạo

Nếu bạn viết hàm tạo của riêng mình thì hàm tạo mặc định tích hợp sẵn sẽ tồn tại, vì vậy bạn sẽ phải tự viết nó (hàm tạo mặc định)

Trân trọng,
Savage

9 Feb '11 #5

vâng dã man, tôi nhận ra rằng. Tôi chỉ không hiểu tại sao C++ buộc tôi phải có một hàm tạo mặc định, ngay cả khi tôi chỉ muốn các hàm tạo được tham số hóa. Dù sao, danh sách tham số của newb16 đã làm được điều đó. Không cần hàm tạo mặc định

9 Feb '11 #6

C++ truyền đối tượng bằng cách tham chiếu đến hàm tạo

Vì các đỉnh chứa trong lớp Tam giác là các đối tượng thực chứ không phải các tham chiếu nên chúng cần được xây dựng. Vì danh sách trình khởi tạo chạy hàm tạo "trước", nên vấn đề có thể được giải quyết theo cách này vì danh sách sử dụng toán tử xác nhận sẵn có. nhưng nếu sau này bạn muốn trả về một Vector theo giá trị từ một hàm nào đó thì sao?

  1. Vector tạoRandomVector()
  2. {
  3. //tạo vectơ ngẫu nhiên
  4. return  rndVector;
  5. }

, khi hàm này trả về, nó sẽ đặt giá trị trả về của nó vào khung ngăn xếp bằng cách sử dụng hàm tạo mặc định. vấn đề duy nhất là hàm tạo mặc định đã bị chặn bởi hàm tạo gán của bạn và mã sẽ không biên dịch cho bạn một thông báo lỗi tương tự như trước khi bạn giải quyết nó bằng cách sử dụng danh sách của trình khởi tạo. ^^

Vì vậy, nếu bạn dự định có một số hàm như trên, hãy viết hàm tạo mặc định hoặc gán giá trị mặc định cho hàm tạo gán của bạn

Trân trọng,
Savage

9 Feb '11 #7

Tôi hiểu rôi, cảm ơn bạn

Tôi đoán tùy chọn tốt nhất của mình sẽ là chỉ lưu trữ các tham chiếu hoặc con trỏ thay vì các đối tượng, vì tôi muốn chia sẻ các đỉnh giữa các hình tam giác

Câu hỏi khác;

Có thể trả về một con trỏ tới một đối tượng được tạo trong phần thân của hàm như vậy không?

  1. Vertex* tạoRandomVertex()
  2. {
  3. //tạo các giá trị x,y,z ngẫu nhiên
  4. Đỉnh v(x,y,z);
  5. Vertex* con trỏ = &v;
  6. con trỏ trở lại;
  7. }

Hoặc đối tượng 'cục bộ' trong cơ thể sẽ được giải cấu trúc sau khi trả lại? . p

9 Feb '11 #8

C++ truyền đối tượng bằng cách tham chiếu đến hàm tạo

Bạn có thể, nhưng bạn cần tạo đối tượng trên heap chứ không phải trên ngăn xếp như bạn đã làm ở đây vì sau khi gọi hàm, tất cả các biến cục bộ của hàm sẽ bị xóa, vì vậy bạn sẽ trả lại một con trỏ tới một số rác

Viết nó như thế này thay vì

  1. Vertex* tạoRandomVertex()
  2. {
  3. //tạo các giá trị x,y,z ngẫu nhiên
  4. Vertex* con trỏ = mới Vertex(x,y,z);
  5. con trỏ trở lại;
  6. }

hoặc thậm chí tốt hơn như thế này

  1. Vertex* tạoRandomVertex()
  2. {
  3. //tạo các giá trị x,y,z ngẫu nhiên
  4. trả về Vector mới(x,y,z);
  5. }

, nhưng nếu bạn muốn sử dụng con trỏ để làm điều này thì hãy nhớ rằng C++ không có trình thu gom rác và bạn sẽ phải tự giải phóng bộ nhớ bằng cách sử dụng xóa. Ngoài ra, nếu bạn muốn chia sẻ các tham chiếu giữa các phiên bản của tam giác, hãy lưu ý rằng các thành viên của lớp tham chiếu phải được khởi tạo trong danh sách trình khởi tạo hàm tạo và ofc, sau khi được khởi tạo, chúng không thể được đặt lại để giới thiệu đến một số đối tượng khác thuộc loại của chúng

Trân trọng,
Savage

9 Feb '11 #9

"nếu bạn muốn chia sẻ các tham chiếu giữa các phiên bản của tam giác, hãy lưu ý rằng các thành viên của lớp tham chiếu phải được khởi tạo trong danh sách trình khởi tạo hàm tạo và ofc, sau khi được khởi tạo, chúng không thể được đặt lại để giới thiệu đến một số đối tượng khác thuộc loại của chúng. "

Bạn có thể xây dựng? . Nó có đúng không?