转发声明和删除

时间:2013-05-17 17:26:57

标签: c++ forward-declaration

我的老师告诉我做最后的功课。我需要用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等.Stuff类必须在List类之后定义。我只是不知道......

5 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:2)

您必须在标头中添加List声明,并将实施放入源文件中,其中Stuff定义可用(#include "Stuff.h"),您可以删除Stuff < / p>

或者您可以在同一个文件中实现List,但在Stuff声明之后,编译器实际上知道要删除的内容

答案 2 :(得分:2)

模板怎么样?

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;
}

答案 3 :(得分: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;
}

答案 4 :(得分:1)

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

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