Собственный объект как данные в stl Multimap - PullRequest
0 голосов
/ 27 августа 2009

Я пишу приложение, в котором я хочу сохранить строки как ключи и пользовательский объект как значение

multimap<string, owncreatedobject> mymap;

Компиляция идет хорошо, но я получаю «Ошибка сегментации» при использовании функции insert во время выполнения.

mymap.insert(string,myobject); --> Segmentation Error

A уже добавил конструктор копирования в функцию присваивания (которая вызывает конструктор копирования)

есть идеи по поводу "ошибки сегментации?"

Ответы [ 4 ]

1 голос
/ 27 августа 2009

Глядя на комментарий, добавленный вами к конструктору копирования и реализации оператора присваивания, я обнаружил, что ваша реализация оператора присваивания неверна. По сути, это ничего не копирует, вместо этого с помощью оператора Filter(f); вы создаете локальный объект с именем f. Вы не можете вызвать конструктор копирования таким образом. Я предлагаю вам написать метод приватного копирования и использовать его как в ctor, так и в операторе присваивания.

0 голосов
/ 27 августа 2009

Я возился с твоей проблемой в течение последнего часа и думаю, что понял.

Попробуйте использовать что-нибудь в отношении этого сегмента кода:

multimap<string,yourclass const*> mymap
void addtomap(string s,yourclass const* c)
{
   mymap.insert(pair<string, yourclass const*>(s,c));
}
...`addtomap("abc",&z);

В данном примере вы пытались вставить без итератора. Первым элементом для вызова вставки из 2 элементов для мультикарты является итератор. Вот причина вашей ошибки сегментации и почему следует использовать пару.

0 голосов
/ 27 августа 2009

Я подозреваю, что у вас есть дефектный конструктор копирования и / или реализация оператора присваивания.

Если строка

mymap.insert(std::make_pair(mystring,myobject));

вылетает, вполне вероятно, что какой-то метод, который выполняется на myobject, вызывает проблему. В этой строке кода наиболее интересными функциями являются конструктор копирования и / или оператор присваивания.

Вы говорите, что уже добавили оператор присваивания (который вызывает конструктор копирования), но это звучит странно. Обычно все наоборот. конструктор копирования распределяет ресурсы (т.е. память) по мере необходимости, а затем вызывает оператор присваивания.

ОБНОВЛЕНИЕ: После прочтения вашего комментария, вот как должен выглядеть ваш конструктор копирования:

Filter::Filter( const Filter &rhs ) {
    // Apparently no resource acquisition like memory allocation is necessary,
    // so just assign the rhs value.
    *this = rhs;
}

А вот и оператор присваивания. Обратите внимание, как он просто копирует значения. Скорее всего, вам вообще не нужна реализация оператора присваивания (или конструктора копирования), потому что синтезированный компилятором код подходит для вашего использования.

Filter &Filter::operator=( const Filter &rhs ) {
    SrcNET = f.SrcNET;
    SrcPort = f.SrcPort;
    DstNET = f.DstNET;
    FlowLabel = f.FlowLabel;
    return *this;
}
0 голосов
/ 27 августа 2009

Я предполагаю, что вы пытаетесь вызвать версию insert , которая принимает value_type мультикарты. В этом случае, просто помните, что value_type мультикарты это std::pair. Затем попробуйте это:


mymap.insert(std::make_pair(mystring,myobject));

РЕДАКТИРОВАТЬ (после вашего комментария) : ваш оператор присваивания содержит ошибку. Вы создаете временный, который служит без цели. Ниже приведено предложение по реализации с использованием swap idiom . (Обратите внимание, что я не знаю, какие типы членов класса. Предположим, что они встроены, например, int.)


void Swap(Filter const& f) //Create a swap member function.
{
  std::swap(SrcNET, f.SrcNET);
  std::swap(SrcPort, f.SrcPort);
  std::swap(DstNET, f.DstNET); 
  std::swap(DstPort, f.DstPort); 
  std::swap(FlowLabel, f.FlowLabel);   
}

Filter& Filter::operator =(Filter f)
{ 
  swap(f); //Swaps the copy created for parameter passing (pass-by-value) above.
  return *this;
} 
...