Dynami c массив в классах c ++ [SOVED] - PullRequest
0 голосов
/ 23 марта 2020

Я создал заголовочный файл polygon.h и polygon. cpp

polygon.h:

#pragma once
#include <iostream>

using namespace std;

class Polygon {
    protected:
        int numSides;
        int* sides;

    public:
        Polygon(int nSides);
        Polygon(const Polygon&);
        ~Polygon();

        int getNumOfSides();
        int perimeter(); // perimeter = hekef

        bool operator==(Polygon);
};

polygon . cpp:

#include <iostream>
#include "Polygon.h"

using namespace std;

Polygon::Polygon(int nSides) {
    this->numSides = nSides;
    this->sides = new int[nSides];

    if (nSides != 3 && nSides != 4)
    {
        cout << "Enter sides for polygon: " << endl;
        for (int i = 0; i < nSides; i++)
            cin >> this->sides[i];
    }
};

Polygon::Polygon(const Polygon& other) {
    this->numSides = other.numSides;
    this->sides = new int[other.numSides];

    for (int i = 0; i < this->numSides; i++)
        this->sides[i] = other.sides[i];
};

Polygon::~Polygon() {
    delete [] this->sides;
};

int Polygon::getNumOfSides() {
    return this->numSides;
};

int Polygon::perimeter() {
    int sum = 0;

    for (int i = 0; i < this->numSides; i++)
        sum += this->sides[i];

    return sum;
};

bool Polygon::operator==(Polygon other) {
    return (this->getNumOfSides() == other.getNumOfSides() && this->perimeter() == other.perimeter());
};

Я также создал файл Main, но это не имеет значения.

Проблема заключается в том, что я передаю, например, numSides значение 5 и программа должны создать из сторон новый динамический массив c int с 5 слотами, как в этом примере, но вместо этого при отладке я обнаружил, что он создает только 1 слот, как будто это обычное целое число, и когда я устанавливаю 5 значений в сторон (как в этом примере с 5), сторон заканчивается только первым значением I

Буду рад, если кто-нибудь поможет и хотя бы решит эту проблему:)

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Вы не сказали, какой отладчик вы используете, но для Visual Studio вы можете вручную отредактировать запись отладчика так:

<pointer>, <size>

Так что в этом случае вы скажете:

sides, 5

См. Эту страницу для получения дополнительной информации:

https://support.microsoft.com/en-us/help/198953/how-to-expand-an-array-pointer-in-the-visual-c-debugger-watch-window

0 голосов
/ 23 марта 2020

Как WhozCraig и 1201ProgramAlarm указано о std :: vector в комментариях выше:

Отладчик знает только, что sides является указателем и не знает, на сколько элементов он указывает. Если вы используете std::vector, вы сможете увидеть все точки.

С указанием очевидного, std::vector<int> sides;, а не ручное управление памятью сделало бы это тривиальным, и в качестве бонуса, устраняет необходимость в numSides член также. Тем не менее, вы используете из "вызывающего" кода является актуальным. Это должно быть включено в ваш вопрос. Вам также не хватает оператора копирования, поэтому вы вводите рецепт для правила трех нарушений . Вещи, над которыми нужно работать массива.

...