2012-04-26 26 views
5

Hãy xem xét tôi có một tên lớp Người. Tôi đang lưu trữ các con trỏ tới những người này trong một bản đồLàm thế nào để xử lý một bản đồ với con trỏ?

map<string, People*> myMap; 

Để tạo người mới tôi sử dụng toán tử map [].

myMap["dave"]->sayHello(); 

Nhưng điều này mang lại cho tôi lỗi phân đoạn và thậm chí không gọi hàm tạo của lớp Mọi người.

Tôi cũng đã cố gắng

myMap.insert(std::make_pair("dave", new People())); 

Nhưng điều đó không thay đổi bất cứ điều gì, các vị thi công vẫn không được gọi và chương trình tắt chế biến mã này với một lỗi phân khúc.

Làm cách nào để truy cập và thao tác bản đồ với con trỏ trong đó? Tại sao không phải là ở trên làm việc, tôi không nhận được lỗi thời gian biên dịch hoặc cảnh báo.

Bất kỳ cái nhìn sâu sắc nhiều đánh giá cao, cảm ơn bạn

Trả lời

9

Với bản đồ:

map<string, People*> myMap; 

operator[] sẽ không tạo mới People, nó sẽ tạo People*, gợi ý nghĩa mà không trỏ đến bất cứ điều gì.

Giải pháp đơn giản nhất là làm cho bản đồ của bạn thực sự chứa người, chứ không phải con trỏ, ví dụ .:

map<string, People> myMap; 

sau đó công tác quản lý bộ nhớ được tất cả các xử lý cho bạn, sử dụng operator[] sẽ xây dựng những người mới khi cần thiết.

+1

hoặc con trỏ thông minh, nếu việc xây dựng 'Con người' là đắt tiền –

+0

Cảm ơn bạn đã giải thích rõ ràng! – user1356190

2

Hãy thử

myMap["dave"] = new People(....); 

Các new sẽ gọi các nhà xây dựng, trả về một con trỏ và chèn nó vào bản đồ.

Mặc dù vậy, bạn cần phải cẩn thận về rò rỉ bộ nhớ. Sử dụng con trỏ thông minh để vượt qua vấn đề này.

+0

Cảm ơn điều này đã làm việc hoàn hảo trong việc thực hiện hiện tại của tôi. – user1356190

0

Nếu bạn muốn phân bổ số tiền People nhưng sử dụng bản đồ, hãy xem Boost Pointer Containers, cụ thể là boost::ptr_map. Đó là tiêu đề duy nhất, do đó bạn không cần phải biên dịch bất kỳ thư viện bổ sung nào.

#include <iostream> 
#include <string> 
#include <boost/ptr_container/ptr_map.hpp> 

struct People 
{ 
    int age; 
}; 

typedef boost::ptr_map<std::string,People> PeopleMap; 

int main(int,char**) 
{ 
    PeopleMap data; 

    data["Alice"].age = 20; 
    data["Bob"].age = 30; 

    for (PeopleMap::const_iterator it = data.begin(); it != data.end(); ++it) 
     std::cout << "Name: " << it->first << " Age: " << it->second->age << std::endl; 

    return 0; 
} 
0

Thử sử dụng:

People* new_people = new People (member_variable1,member_variable2); 

myMap.insert(std::pair<std::string, People*>("key for string",new_people)); 

hoặc:

People new_people(member_variable1,member_variable2); 
myMap.insert(std::pair<std::string, People*>("key for string",&new_people)); 

Cả hai sẽ làm việc !!!

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