Как мне объявить указатель на массив объектов Class внутри закрытых членов DIFFERENT Class? - PullRequest
0 голосов
/ 13 апреля 2020

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

Позвольте мне предвосхитить эту проблему, сказав, что мне НЕОБХОДИМО использовать указатели, какими бы раздражающими они ни были, для решения этой проблемы. Я не могу использовать вектор, поскольку он не был рассмотрен в нашем материале курса.

Я привык к следующему формату для объявления указателя на массив.

int* numbers;
numbers= new int[10];

Bin go Я только что создал массив с десятью элементами, которые могут хранить целые числа. Woot!

Теперь я пытаюсь создать указатель на массив объектов, а не только на любые объекты!

У меня есть два класса. Один называется Аккаунт, а другой - Транзакция. В закрытых членах моего класса Account мне нужно сделать «Указатель на массив транзакций, используемый для отслеживания всех транзакций, выполненных для этой учетной записи». Почему я так поступаю? Удиви меня до чертиков, вот инструкции, которые мне дали, и я просто скопировал их в раздел Личный кабинет пользователя.

Вот как я пытался это сделать:

    class Account
{

    private:
        static const int MAX_TRANS = 100;
        int mAcctType;
        int mNumTrans;
        double mAcctBal;
        std::string mAcctName;

    Transaction* transaction;
    transaction = new Transaction[MAX_TRANS];

    void allocate();
    void deallocate();
    void copy(const Account& account);
public: 
    static const int CHECKING = 0;
    static const int SAVINGS = 1;

Я не могу понять, что я сделал неправильно, но получаю несколько сообщений об ошибках.

Первое в этом разделе:

`   Transaction* transaction;
    transaction = new Transaction[MAX_TRANS];`

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

Далее я получаю следующие сообщения об ошибках.

C2143   syntax error: missing ';' before '*'
C2238   unexpected token(s) preceding ';'   
C4430   missing type specifier - int assumed. Note: C++ does not support default-int    

Вот полный код для моего класса транзакций:

#ifndef TRANSACTION_H
#define TRANSACTION_H

#include"Account.h"
#include <iostream>
#include <string>

class Transaction
{
private:
    int mTransType;
    double mTransAmt;

public:
    static const int DEPOSIT = 1;
    static const int WITHDRAW = 0;
    Transaction();
    Transaction(int mTransType, double mTransAmt);
    int GetTransType() { return mTransType; };
    double GetTransAmt() { return mTransAmt; };
    friend std::ostream &operator<<(std::ostream& out, Transaction transaction);
};

#endif

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

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

1 Ответ

0 голосов
/ 13 апреля 2020

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

Если честно, я не знаю, существует ли что-то подобное, «указатель на массив». Здесь:

Transaction* transaction;

transaction - указатель на один Transaction. Если вы хотите, чтобы это был первый элемент динамически распределяемого массива, то это ваш бизнес. Вы должны сделать всю бухгалтерию: выделить правильный размер, перераспределить, если необходимо, соблюдать правило 3/5 и, наконец, что не менее важно, убедиться, что у вас нет утечки памяти. Все это является кошмаром, оно подвержено ошибкам, и кроме того, что для пыток студентов нет практического смысла делать все это вручную (std::vector или умные указатели должны использоваться для динамических c массивов). Это может показаться расщеплением волос, но важно понимать, что transaction действительно указывает на один объект, и если вам нужно больше, вы сами.

Проблема с transaction = new Transaction[MAX_TRANS]; заключается в том, что вы не может назначить член в объявлении класса вне функции. Вы можете использовать конструктор для выделения массива. Однако, если в любом случае вы всегда выделяете массив фиксированного размера, тогда нет необходимости в динамическом выделении c во-первых:

class Account {
private:
    static const int MAX_TRANS = 100;
    Transaction transaction[MAX_TRANS];
    // ... more ...
}
...