1

我的老师让我做一个期末作业。我需要用 C++ 列出一些东西(不能使用 boost、STL 等)。我的 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;
}

我知道:

“如果被删除的对象在删除点具有不完整的类类型,并且完整的类具有非平凡的析构函数或释放函数,则行为未定义。”

但那我该怎么做呢?有任何想法吗?请记住,我不能使用 boost、STL 等。而且必须在 List 类之后定义 Stuff 类。我只是不知道...

4

5 回答 5

4

要使此代码正常工作,您需要在定义类构造函数和析构函数Stuff之前进行定义。List

所以:

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()
{
    delete[] s;
    s = NULL;
    n = 0;
}
List::List(int n)
{
    this->n = n;
    s = new Stuff[n];
}
于 2013-05-17T17:33:11.920 回答
3

模板呢?

template<class T>
class List
{
private :

    T *s;
    int n;

public :

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

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

class Stuff
{
private :

    string name;
    double price;

public :

    Stuff(){}
    ~Stuff(){}
};


int main(int argc, char **argv)
{
    List<Stuff> list(4);
    return 0;
}
于 2013-05-17T17:39:07.130 回答
2

您必须将List声明放在标题中并将实现放入源文件中,其中Stuff定义可用(#include "Stuff.h")并且您可以删除Stuff

或者你可以List在同一个文件中实现,但是在Stuff声明之后,所以编译器实际上知道要删除什么

于 2013-05-17T17:31:34.633 回答
1

您已将class Stuff;其替换为实际实现的代码。class Stuff;是前向声明,表示可以引用class Stuff但不能使用。

这里有两个解决方案:


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 回答
1

将声明与实现分开。虽然您不能使用 boost 等,但您可以使用单独的头文件和源文件。

类的定义List放在list.hh中,类的定义Stuff放在stuff.hh中。在 class 的定义中List(在 list.hh 中),声明但不定义那些需要知道 class 的成员函数Stuff。将这些函数定义放在源文件 list.cpp 中。此源文件将 #include list.hh 和 stuff.hh。

于 2013-05-17T17:33:00.510 回答