2009-06-20 95 views
7

Tôi muốn tạo một số đối tượng (bằng C++) dựa trên số lượng/số mà người dùng nhập. Bây giờ tôi ở đâu đó nghe nói rằng nó đã được thực hiện bằng cách sử dụng thủ thuật con trỏ, tạo ra một con trỏ đến một mảng của các loại đối tượng cần thiết, và sau đó tự động tăng kích thước của mảng (tại thời gian chạy). không cóCách tạo tên đối tượng động C++?

Là một workaround trực tiếp sử dụng những cái tên như Object1, Object2 ..... ObjectX thay vì có classname * Object [] và sau đó sử dụng các chỉ số mảng để có được những đối tượng?

Trong cả hai trường hợp, sẽ rất tuyệt nếu ai đó có thể làm rõ về vấn đề này.

Cảm ơn!

+0

Nó gần như không thể làm việc ra những gì bạn có nghĩa là từ câu hỏi. Bạn đang nói về một container có độ dài thay đổi? –

+0

Ah. Những gì ông nói! –

Trả lời

6

Cho đến nay, không ai giải thích tại sao suy nghĩ của bạn thiếu sót. C++ là một ngôn ngữ được biên dịch, và nó đi đến độ dài lớn để biến chương trình nguồn thành mã máy hiệu quả. Vì lý do này, tên bạn cung cấp cho các biến chỉ có sẵn cho chương trình vào thời gian biên dịch, khi bạn biến nó từ nguồn thành một tệp thực thi. Sau đó, khi bạn muốn tạo các đối tượng động, các loại thông tin đó sẽ không còn nữa. Chương trình chỉ biết về các địa chỉ máy nơi có các lệnh toán hạng đến các lệnh máy.

+0

Cảm ơn lời giải thích, chính xác những gì tôi cần (để hiểu). Chúc mừng! –

8

Nếu bạn muốn mảng có kích thước động, hãy sử dụng std :: vector. Bạn sẽ không thể thay đổi kích cỡ mảng được tích hợp sẵn. Nếu bạn muốn để có thể nhận được một đối tượng bằng tên chuỗi, sau đó bạn nên sử dụng std :: bản đồ, nó có một indexer:

std::map<string, Classname> myMap; 
myMap["Object1"] = Classname(); 
Classname newClassname = myMap["Object1"]; 
+0

+1 để bù lại số phiếu bầu không thể giải thích được - một bản đồ là một cách tiếp cận tốt nếu bạn muốn xử lý các đối tượng theo tên chuỗi chứ không phải theo số. –

+0

Cảm ơn ý tưởng về bản đồ. Tôi chắc chắn sẽ có một cái nhìn sâu hơn vào nó là tốt. –

+0

Tôi biết đây là bài viết rất cũ, và tôi có lẽ không nên bình luận về điều này, nhưng tôi không thể không nhận thấy rằng trong ví dụ này, bạn vẫn phải sử dụng một tên đối tượng cụ thể (newClassname). Điều gì sau đó là điểm của việc sử dụng bản đồ? Có thể sử dụng 'mapname [key]' giống như chính đối tượng, không bao giờ đặt tên nó một cách rõ ràng, như 'mapname [key] -> somefunc()' giả định khai báo là 'std :: map mapname'? Tôi đang cố gắng hiểu tại sao bản đồ lại hữu ích nếu không thể sử dụng mục nhập bản đồ dưới dạng tên được tạo động? –

3

Không, không có. Hơn nữa, bạn không cần phải; sử dụng std::vector.

3

Khi tôi bắt đầu lập trình cách đây 9 năm, tôi đã tự hỏi mình cùng một câu hỏi. Câu trả lời là: bạn không thể.

Bạn thực sự có thể sử dụng mảng và định lại kích thước động, tuy nhiên sử dụng vectơ stl dễ dàng hơn nhiều (khi bạn tìm hiểu cách sử dụng nó).

+0

9 năm trước bạn nói :) mà làm cho tôi phải chờ đợi một thời gian dài, hehe! thực sự đánh giá cao câu trả lời! –

3

Bạn không thể làm điều đó vì C++ không có "môi trường" (reflection) trong đó các biến (và siêu dữ liệu) có thể cư trú. Hơn nữa, trong C++ tất cả các tên biến là biến mất khi mã được biên dịch.

Cách để đạt được hiệu quả bạn muốn là sử dụng Map trong đó các phím là chuỗi.

+0

Cảm ơn bạn lần nữa vì ý tưởng có bản đồ.Tôi chắc chắn sẽ xem xét. –

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