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