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





Вы вставляете копию 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 также будет удален.
Вы должны взглянуть на Что такое отладчик и как он может помочь мне в диагностике проблем?.