Для вызова метода Loop - PullRequest
0 голосов
/ 23 января 2019

Появляется ошибка, говорящая о том, что тип класса не предоставляет оператор нижнего индекса.

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

  class Transaction {
    protected:
        char * ime;
        char smetka[16];
        float iznos;
        Date d;
    public:
        Transaction() {}
        Transaction( char * ime , char * smetka  ,float iznos ,Date d ) {
            this->ime  = new char[strlen(ime)+1];
            strcpy(this->ime,ime);
            strcpy(this->smetka,smetka);
            this->iznos=iznos;
            this->d=d;
        }

    Transaction(const Transaction & c) {
        ime  = new char[strlen(ime)+1];
        strcpy(this->ime,c.ime);
        strcpy(this->smetka,c.smetka);
        this->iznos=c.iznos;
        this->d=c.d;
    }

    friend ostream & operator<<(ostream & out, const Transaction & c) {
        if(c.iznos>0) {
            return out << "Inflow " << c.iznos   << " " << c.ime   << "(" << c.smetka << ")-" << c.d.getDay() << "." << c.d.getMonth() << "." << c.d.getYear() << endl;
        } else {
            return out << "Outflow " << c.iznos   << " " << c.ime   << "(" << c.smetka << ")-" << c.d.getDay() << "." << c.d.getMonth() << "." << c.d.getYear() << endl;
        }
    }

    Transaction(char * ime, char * smetka) {
        this->ime = new char[strlen(ime)+1];
        strcpy(this->ime,ime);
        strcpy(this->smetka,smetka);
    }
};


class TransactionAccount {
private:
    char * ime;
    char smetka[16];
    Transaction * t;
    int n;
    int kapacitet;
public:
    TransactionAccount() {
        this->t = new Transaction[3];
        this->kapacitet=3;
    }

    TransactionAccount(char * ime,char * smetka) {
        this->ime = new char[strlen(ime)+1];
        strcpy(this->ime,ime);
        strcpy(this->smetka,smetka);
    }


    void addTransaction(Transaction & a) {
        if(n<kapacitet) {
            this->t = &a;
        } else {
            kapacitet*=2;
            this->t = &a;
        }
    }

    Transaction getTransList() {
        return *t;
    }

    int getTransCapacity() {
        return this->kapacitet;
    }
    int getTransNumber() {
        return this->n;
    }
    virtual ~TransactionAccount() {}
};



int main() {

    char name[50],number[16];
    float amount;
    int d,m,y;
    int n;
    bool isInflow;
    TransactionAccount ta;
    int testcase;
    cin>>testcase;

    switch (testcase) {
    case 1: {
        cout<<"------Transaction test------"<<endl;
        cin>>name;
        cin>>number;
        cin>>amount;
        cin>>d>>m>>y;
        Transaction t(name,number,amount,Date(d,m,y));
        cout<<t;
    }
    break;
    case 2: {
        cout<<"------TransactionAccount test:constructor, desctuctor & get- 
        functions------"<<endl;
        cin>>name;
        cin>>number;
        TransactionAccount ta(name,number);
        cin>>n;
        for (int j=0; j<n; j++) {
            cin>>name>>number>>amount>>d>>m>>y;
            Transaction t(name,number,amount,Date(d,m,y));
            ta.addTransaction(t);
        }
        cout<<"Capacity: "<<ta.getTransCapacity()<<endl;
        cout<<"Number of elements: "<<ta.getTransNumber()<<endl;  

                     cout<<(ta.getTransList())[n];  // -- here is the 
                                                     problem                               
        cin>>n;
        cout<<"The element on position "<<n<<" is "<<endl;    

    }
     return 0;
}

Мой желаемый результат заключается в том, что он вызывает предыдущий объект (класса) ипечатает это.

1 Ответ

0 голосов
/ 23 января 2019

Ответ на этот конкретный вопрос заключается в том, что getTransList возвращает один Transaction (а не, как следует из названия, «список»). Ошибка возникает из-за того, что Transaction не имеет перегруженного оператора индекса (что нормально; вероятно, не должно).

Transaction getTransList() {
    return *t;
}

следует заменить на

Transaction* getTransList() {
    return t;
}

, который правильно возвращает массив.

Однако существует много других проблем с предоставленным кодом. Некоторые станут очевидными, когда вы попытаетесь запустить / отладить код; в остальном, хотя вы, конечно, можете задавать (новые) вопросы о конкретных проблемах на этом сайте, вам лучше проконсультироваться с преподавателем.

...