Как добавить объект в вектор и проверить, сработало ли это

У меня есть класс WayPoint, который содержит пару двойников и имя. У меня есть класс WayPointContainer, который содержит вектор путевых точек.

У WayPointContainer есть метод для добавления WayPoint к своему вектору и метод Print для отображения WayPoints внутри вектора. Я реализовал оба, но не знаю, как проверить, работает ли он. Мой метод печати не печатает ни одного WayPointName. Так что либо мой метод Добавлять, либо мой метод Распечатать неверен.

Поэтому, как только я вызываю метод Add c1->Добавить(*p1) WayPointContainer, программа останавливается. я попробовал другую версию, используя вставку () вектора с итератором. Я также пытался распечатать емкость, но каждый метод просто приводит к остановке программы, поэтому я предполагаю, что что-то с инициализацией не так? Я получил заголовочные файлы от своего профессора, поэтому надеюсь, что они верны. И так как он не отвечает мне, я пробую это здесь.

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

Путевая точка.h

#ifndef WAYPOINT_H_
#define WAYPOINT_H_
#include <iostream>

namespace HHN {

class WayPoint {
private:
    std::string name{ "" };
    std::pair<double, double> coords{ 0.0, 0.0 };
public:
    WayPoint();
    virtual ~WayPoint();
    WayPoint(const WayPoint& orig);
    WayPoint(const std::string& xName, double xCoord, double yCoord);

    WayPoint& operator=(const WayPoint& rhs);

    std::string Name() const;
    double first() const;
    double second() const;
};

} /* namespace HHN */

#endif /* WAYPOINT_H_ */

WayPoint.cpp

#include "WayPoint.h"

namespace HHN {

WayPoint::WayPoint() {}

WayPoint::~WayPoint() {}

WayPoint::WayPoint(const WayPoint& orig) {}

WayPoint::WayPoint(const std::string& xName, double xCoord, double yCoord) {
    this->name = xName;
    this->coords.first = xCoord;
    this->coords.second = yCoord;
}

WayPoint& WayPoint::operator =(const WayPoint& rhs) {
    if (this == &rhs) {
        return *this;
    }
    else {
        this->coords.first = rhs.first();
        this->coords.second = rhs.second();
        this->name = rhs.Name();
    }
    return *this;
}

std::string WayPoint::Name() const {
    return name;
}

double WayPoint::first() const {
    return this->coords.first;
}

double WayPoint::second() const {
    return this->coords.second;
}

} /* namespace HHN */

WayPointContainer.h

#include <vector>
#include <iostream>
#include "WayPoint.h"

#ifndef WAYPOINTCONTAINER_H_
#define WAYPOINTCONTAINER_H_

class WayPointContainer {
private:
    std::vector<HHN::WayPoint>* pContainer{nullptr};
public:
    WayPointContainer();
    WayPointContainer(const WayPointContainer& orig);
    virtual ~WayPointContainer();

    WayPointContainer& operator=(const WayPointContainer& rhs);
    HHN::WayPoint& operator[](int idx) const;

    void Add(const HHN::WayPoint& arg);
    int Size() const;
    void Print() const;
};

#endif /* WAYPOINTCONTAINER_H_ */

WayPointContainer.cpp

#include "WayPointContainer.h"
#include <vector>
#include <iostream>
using namespace std;

WayPointContainer::WayPointContainer() {
    pContainer = new std::vector<HHN::WayPoint>;
}

WayPointContainer::WayPointContainer(const WayPointContainer& orig) {
    pContainer = orig.pContainer;
}

WayPointContainer::~WayPointContainer() {
    delete[] pContainer;
}

WayPointContainer& WayPointContainer::operator =(const WayPointContainer& rhs) {
    if (this == &rhs) {
            return *this;
        }
    else {
        pContainer = rhs.pContainer;
    }
    return *this;
}

HHN::WayPoint& WayPointContainer::operator [](int idx) const {
    return (*pContainer)[idx];
}

void WayPointContainer::Add(const HHN::WayPoint& arg) {
    this->pContainer->push_back(arg);
}

int WayPointContainer::Size() const {
    return pContainer->size();
}

void WayPointContainer::Print() const {
    for (auto waypoint = pContainer->begin(); waypoint != pContainer->end(); ++waypoint) {
            auto tmp = waypoint->Name();
            cout << tmp << " <- Name" << "\n";
        }
}

Main.cpp

#include <iostream>
using namespace std;
#include "WayPoint.h"
#include "WayPointContainer.h"

int main() {
    cout << "!!!Hello World!!!" << endl;

    HHN::WayPoint *p1 = new HHN::WayPoint("nameOfP1",1.5,1.5);  // works
    HHN::WayPoint *p2(p1);                              // works

    WayPointContainer *c1 = new WayPointContainer();    // works
    WayPointContainer *c2(c1);                          // works
    WayPointContainer *c3 = new WayPointContainer();

    c1->Add(*p1);
    c1->Print();

    cout << " Punkt1: " << p1->Name() << " "<< p1->first() << " " << p1->second() << "\n";

    cout << "!!!Hello World out!!!" << endl;
    return 0;
}

Вывод консоли, который я получаю:

!!!Hello World!!!
 <- Name
 Punkt1: nameOfP1 1.5 1.5
!!!Hello World out!!!

но я ожидаю

!!!Hello World!!!
 nameOfP1 <- Name
 Punkt1: nameOfP1 1.5 1.5
!!!Hello World out!!!

(На самом деле это задача моего профессора по реализации данных заголовочных файлов. И, поскольку он до сих пор игнорировал мои письма, я пробую это здесь. Я почти уверен, что это что-то очень маленькое и, вероятно, очевидное для исправления, но я очень начинающий C++ и много борюсь. Я уже несколько дней сижу над этой реализацией.)

Переменная-член pContainer, являющаяся указателем на std::vector, не является хорошим дизайном. Это привело к нескольким ошибкам. Ваш конструктор копирования и оператор присваивания копии заставят оба контейнера указывать на один и тот же std::vector. Я не думаю, что вы хотите, чтобы изменения одного контейнера отображались в обоих. Это также приведет к двойным ошибкам удаления при их уничтожении. Ваш деструктор использует delete[], когда это должно быть просто delete. Мой совет — перестать использовать указатели и new. Они нигде в этом коде не нужны и просто вызывают ошибки и утечки памяти.

Blastfurnace 22.04.2019 13:11

Просто небольшое обновление. Я распечатал, на что указывают указатели (шестнадцатеричные значения), чтобы сравнить векторы объектов, и понял, что мой конструктор копирования WayPointContainer.cpp был неправильным. С этой реализацией это работает: pContainer = new std::vector<HHN::WayPoint>(*orig.pContainer);

Saturas 24.04.2019 09:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы вставляете копию WayPoint в контейнер, но пропустили реализацию конструктора копирования.

void WayPointContainer::Add(const HHN::WayPoint& arg) {
// push_pack do copy object
    this->pContainer->push_back(arg);
}
WayPoint::WayPoint(const WayPoint& orig) {}

Попробуйте реализовать конструктор копирования.

WayPoint::WayPoint(const WayPoint& orig) {
    name = orig.name;
    coords.first = orig.coords.first;
    coords.second = orig.coords.second;
}

Вы правы, спасибо, я полностью пропустил это. Теперь мне нужно только правильно настроить часть деструктора, потому что, если я удалю pContainer из C1, в то время как C2 = C1, pContainer из C2 также будет удален.

Saturas 22.04.2019 14:09

Другие вопросы по теме