2

構造の静的スタックを構築しましたが、構造の配列の作成を含め、すべてが機能します。しかし、何らかの理由で、配列の先頭を構造体に設定できません。

私の.cppファイルでは、push関数で、次の行でエラーが発生し続けます。

stackArray[top] = newStudent;

私が受け取っているエラーは次のとおりです。

"51: 'operator=' に一致しません(((studentstack )this)->studentstack::stackArray + (+(((unsigned int)((studentstack*)this)->studentstack::top) * 24u ))) = ((studentstack*)this)->studentstack::newStudent' "

以下にコードを含めます。

ヘッダー ファイル:

#ifndef studentstack_H
#define studentstack_H

#include <iostream>
#include <string>

using namespace std;

class studentstack {
    private:
        int size;         // Stack size
        int top;          // Top of the Stack

        struct student {
            int ID;
            string Name;
            string Address;
            double GPA; 
        };
        student * stackArray;  // Pointer to the stack
        student * newStudent; // Pointer to the new student

    public: //Constructor
        studentstack(int);

        // Copy Constructor
        studentstack(const studentstack &);

        //Destructor
        ~studentstack();

        //Stack Operaations
        void push(string, int, double, string);
        void pop(int &);
        bool isFull() const;
        bool isEmpty() const;
    };

#endif

学生スタック.cpp

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

using namespace std;

studentstack::studentstack(int SIZE) {
    stackArray = new student[SIZE];
    size = SIZE;
    top = -1;
    int ID = 0;
    double GPA = 0;
}

studentstack::studentstack(const studentstack &obj) {
    if (obj.size > 0)
        stackArray = new student[obj.size];
    else
        stackArray = NULL;

    size = obj.size;

    for (int count = 0; count < size; count++)
        stackArray[count] = obj.stackArray[count];

    top = obj.top;
}

studentstack::~studentstack() {
    delete [] stackArray;
}

void studentstack::push(string name, int id, double gpa, string address) {
    if (isFull()) {
        cout << "The stack is full.\n";
    } else {
        top++;
        newStudent = new student;
        newStudent-> Name = name;
        newStudent-> ID = id;
        newStudent-> Address = address;
        newStudent-> GPA = gpa;
        stackArray[top] = newStudent;
    }
}   

void studentstack::pop(int &id) {
    if (isEmpty()) {
        cout << "The stack is empty.\n";
    } else {
        id = stackArray[top].ID;
        top--;
    }
}

bool studentstack::isFull() const {
    bool status;

    if (top == size - 1)
        status = true;
    else
        status = false;

    return status;
}

bool studentstack::isEmpty() const {
    bool status;

    if (top == -1)
        status = true;
    else
        status = false;

    return status;
}

main.cpp

#include "studentstack.h"
#include <iostream>
#include <string>
using namespace std;

int main() {
    string name;
    int id, var;
    string address;
    double gpa;
    studentstack s[20];

    for(int x =0; x<20; x++) {
        cout << "New Student Name: " << endl;
        cin >> name;

        cout << "ID: " << endl;
        cin >> id;

        cout << "GPA: " << endl;
        cin >> gpa;

        cout << "Address: " << endl;
        cin >> address;

        s.push(name, id, gpa, address)
    }

    cout << "Popping: "
    for(int x = 0; x < 5; x++) {
        s.pop(var);
        cout <<var;
    }

    return(0);
}
4

2 に答える 2

4

この例を、問題を示す最小限のコードに切り詰めることができます。つまり、オブジェクトstudent*の配列内の要素にa を代入しようとするということです。studentオブジェクトへのポインターは、オブジェクトとは異なります。

stackArray[0] = new student(); // does NOT work
stackArray[0] = student();

オブジェクトはコンストラクターによって C++ で作成され、必ずしも を含むとは限らないことに注意してくださいnew。オブジェクトを使用して構築してオブジェクトをnew作成すると、オブジェクトが作成されますが、ヒープ上にそのスペースも割り当てられます。デフォルトでは、オブジェクトは定義されている場所に作成されます。たとえばstudent()、スタック上にオブジェクトを作成し、それを のメモリ内のオブジェクトに割り当てますstackArray[0]

于 2012-12-08T00:08:20.800 に答える
0

質問とは直接関係ありませんが、 main() が機能しないことに注意してください。studentstack20要素の配列を宣言します。

studentstack s[20];

そして後であなたがやっている:

s.push(/* ... */);
s.pop(/* ... */);

それはあまり意味がありません。sではありませんstudentstack。sの配列ですstudentstack。C++ の配列にはメンバー関数がありません。

于 2012-12-08T00:11:17.747 に答える