1

先生は私に最後の宿題をするように言いました。C++ でリストを作成する必要があります (ブースト、STL などは使用できません)。My Stuff クラスは、List クラスの後に定義する必要があります。私が試した小さなサンプル:

#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

class Stuff;

class List
{
    private :

        Stuff *s;
        int n;

    public :

        List(int n)
        {
            this->n = n;
            s = new Stuff[n];
        }

        ~List()
        {
            delete[] s;
            s = NULL;
            n = 0;
        }

};

class Stuff
{
    private :

        string name;
        double price;

    public :

        Stuff(){}
};

int main(int argc, char **argv)
{
    return 0;
}

そんなこと知ってる:

「削除されるオブジェクトの削除時点で不完全なクラス型があり、完全なクラスに重要なデストラクタまたは割り当て解除関数がある場合、動作は未定義です。」

しかし、どうすればそれを行うことができますか?何か案は?覚えておいてください、ブースト、STLなどは使用できません。また、Listクラスの後にStuffクラスを定義する必要があります。私は知りません...

4

5 に答える 5

2

List宣言をヘッダーに入れ、実装をソース ファイルに入れる必要があります。ここで、定義Stuffが利用可能 ( #include "Stuff.h") であり、削除できます。Stuff

Listまたは、同じファイルに実装することもできますが、Stuff宣言後に、コンパイラは実際に何を削除するかを認識します

于 2013-05-17T17:31:34.633 に答える
1

class Stuff;実際に実装されたコードに置き換えた場所。class Stuff;は前方宣言です。参照はできclass Stuffますが、使用できません。

ここに2つの解決策があります:


class Stuff {
private :
    string name;
    double price;
public :
    Stuff(){}
};

class List
{
private :
    Stuff *s;
    int n;
public :
    List(int n) {
        this->n = n;
        s = new Stuff[n];
    }
    ~List() {
        delete[] s;
        s = NULL;
        n = 0;
    }
};

class Stuff;

class List
{
private :
    Stuff *s;
    int n;
public :
    List(int n);
    ~List();
}

class Stuff {
private :
    string name;
    double price;
public :
    Stuff(){}
};

List::List(int n) {
    this->n = n;
    s = new Stuff[n];
}
List::~List() {
    delete[] s;
    s = NULL;
    n = 0;
}
于 2013-05-17T17:31:11.137 に答える