Как добавить объект в вектор и проверить, работает ли он - PullRequest
0 голосов
/ 22 апреля 2019

Я получил класс WayPoint, который содержит пару чисел и имя.Я получил класс WayPointContainer, который содержит вектор Waypoints.

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

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

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

WayPoint.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 ++ и много борюсь. Я уже несколько дней сижу на этой реализации.)

1 Ответ

2 голосов
/ 22 апреля 2019

Вы вставляете копию 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...