2011-07-20 47 views
5

Tôi đang cố gắng tạo danh sách/bộ sưu tập các đối tượng C++ trong C++/CLI và tôi đã thử nhiều cách khác nhau nhưng không có gì hoạt động (lỗi tại thời gian biên dịch).Tạo một số loại danh sách đối tượng C++ trong C++/CLI

Tôi đã thử:

List<MyCppObject*> ^myList; //Does not allow non-.NET objects 

ArrayList ^myList; 
... 
myList->Remove(myCppObject); //cannot convert parameter 1 from 'MyCppObject *' to 'System::Object ^' 

yêu cầu của tôi:

1) Danh sách PHẢI chứa C++ đối tượng

2) Tôi cần khả năng loại bỏ một đối tượng cụ thể (ví dụ vector sẽ không hoạt động vì nó chỉ đẩy/bật lên trên cùng)

Câu hỏi: Làm cách nào để tạo danh sách/bộ sưu tập các đối tượng C++ trong một hàm C++/CLI làm việc với khả năng dễ dàng loại bỏ một đối tượng cụ thể?

Hãy cho tôi biết nếu có ai muốn thêm một số thông tin bổ sung; Cảm ơn trước sự giúp đỡ của bạn!

+1

Không có gì sai với gọi 'std :: vector :: erase () ', nó chỉ là không tối ưu về hiệu suất nếu bạn làm điều đó rất nhiều. Ngoài ra, 'std :: list ' đã chèn/xóa nhanh bất kỳ đâu và không làm mất hiệu lực trình vòng lặp. –

+0

'std :: vector :: erase()' là O (N), giống như CLR 'List .RemoveAt()' và 'ArrayList.RemoveAt()', vì vậy nếu bạn hài lòng với đặc tính hiệu suất của Danh sách , bạn sẽ hài lòng với véc tơ. –

+0

@Kerrek SB: không, nó sẽ không được sử dụng một tấn, vì vậy hiệu suất khôn ngoan tôi cho rằng nó sẽ là ok. Nhưng như tôi thấy bây giờ, nó chỉ mất trong một chỉ số như một tham số (không phải là một đối tượng)? Vì vậy, tôi cho rằng tôi sẽ phải thực hiện tìm kiếm của riêng mình để tìm chỉ mục và sau đó xóa chỉ mục đó? – developer

Trả lời

2

Để lưu trữ các đối tượng/con trỏ gốc, bạn phải sử dụng các lớp sưu tập gốc. Nếu bạn muốn lớp sưu tập duy trì việc sử dụng phân bổ/deallocation <MyCppObject> hoặc sử dụng <MyCppObject*> nếu bạn duy trì việc cấp phát bộ nhớ (tức là lớp thu thập sẽ chỉ giữ các con trỏ).

Lớp STL/CLR sẽ làm điều gì đó ngược lại - bạn có thể sử dụng các lớp STL để lưu trữ các đối tượng .NET.

+0

Bạn sẽ đề xuất những lớp học bản địa nào? (Công việc tương tự như Danh sách trong .Net) – developer

+0

@developer: ['std :: vector <>'] (http://msdn.microsoft.com/en-us/library/9xd04bzs.aspx) là phần tử tương đương trực tiếp vào 'Hệ thống :: Bộ sưu tập :: Chung :: Danh sách <>'. – ildjarn

+1

Dường như tôi có thể có một con trỏ đến kiểu gốc của tôi! Do đó tôi không còn lỗi nữa. :) http://www.codeproject.com/Messages/2204592/mixed-types-are-not-supported.aspx – developer

3

của nó hoặc System::IntPtr các đối tượng không được quản lý như trong List<System::IntPtr>^ hoặc std::list (hoặc C++ danh sách của riêng bạn) và sau đó bao bọc xung quanh rằng

EDIT:

Bạn có thể làm điều đó như thế này

MyCppObject mynativeobj[10]; 
    System::Collections::Generic::List<System::IntPtr>^ mlist = gcnew System::Collections::Generic::List<System::IntPtr>(); 

    for(int i =0;i<10;i++) 
    { 
     mlist->Add(System::IntPtr((void*)&mynativeobj[i])); 
    } 

Vấn đề duy nhất là tất cả bộ nhớ sẽ vẫn nằm trong phần không được quản lý để nếu các vars của bạn nằm ngoài phạm vi IntPtr giây sẽ không còn hợp lệ nữa. Ngoài ra, bạn cần giải phóng bộ nhớ dưới con trỏ của mình

+0

hoặc 'std :: set' ... hoặc vùng chứa không có thứ tự, có thể là STL hoặc những người khác như Google v.v. ... –

1

Nếu bạn không cần một container quản lý, bạn có thể sử dụng bản địa list loại:

#include <list> 

std::list<MyCppObject*> mylist; 
// ... 
mylist.remove(mycppobjptr); 
+0

'Hệ thống :: Bộ sưu tập :: Chung :: Danh sách' không phải là danh sách được liên kết, nó có thể thay đổi kích thước mảng. Do đó, 'std :: vector <>' sẽ là một khuyến nghị tốt hơn so với 'std :: list <>'. – ildjarn

+0

Tôi nhận được lỗi sau với mã này tuy nhiên: lỗi C4368: không thể xác định 'myList' là thành viên của 'MyNamespace :: MyManagedClass' được quản lý: các loại hỗn hợp không được hỗ trợ. – developer

+0

@developer: Aha. Tôi đã được ấn tượng này chỉ là một biến địa phương. Tôi đoán câu trả lời này sẽ không được sử dụng nhiều cho bạn sau đó. : P –

0

thử

single object 
MyCppObject^ _myCppObject = gcnew MyCppObject(); 

list of objects 
List< MyCppObject ^>^ LIST = gcnew List<MyCppObject>(); 

add single element 
LIST->Add(_myCppObject); 

// remove single element 
LIST->Remove(_myCppObject); 

// these are all managed objects so when loss of scope it self destructs 

// although such might be the case as per System::GC, you may still do... 

LIST->Clear(); 

delete LIST; 

LIST = nullptr; 
Các vấn đề liên quan