是类原型的必要条件
C++ - Is a class prototype necessary ?
注:代码张贴在下面。
我希望类dynamic array
能够实例化merge_inner
类。所以我添加了一个像这样的公共函数:
merge_sort() // merge_sort() is function in class dynamic_array
{
merge_inner<T> M1;
}
然而,这是在一个文件中,并且merge_inner在dynamic_array下面定义。我如何创建一个类原型,使动态数组知道merge_inner是一个真正的类。
给出的错误是。
merge_inner not declared in scope
感谢#include "c_include.cpp"
using namespace std;
template <class T> class dynamic_array
{
protected:
T* array;
public:
int size;
void rorder();
void order();
void randorder();
void print_operator(ostream&)const;
dynamic_array(int sizein)
{
size=sizein;
array=new T[size]();
}
merge_sort()
{
merge_inner<T> M1;
}
};
template <class T> void dynamic_array<T>::print_operator(ostream &os=cout)const
{
for (int i = 0; i < size; i++) os << array[i] << endl;
}
template <class T> void dynamic_array<T>::randorder()
{
srand(time(NULL));
int *ap;
for(ap=array;ap!=array+size;++ap){*ap=rand();}
}
template <class T> void dynamic_array<T>::order()
{
int *ap,i=0;
for(ap=array;ap!=array+size;++ap)
{
*ap=i;
++i;
}
}
template <class T> void dynamic_array<T>::rorder()
{
int *ap,i=size-1;
for(ap=array;ap!=array+size;++ap)
{
*ap=i;
--i;
}
}
template<class T> ostream& operator<<(ostream& stream, dynamic_array<T> const& data)
{
data.print_operator(stream);
return stream;
}
/*
Merge Sort
*/
template <class T> class merge_inner : public dynamic_array <T>
{
using dynamic_array<T>::array;
private:
const static int size;
int scratch[];
void flip_if_unordered(int &x, int &y)
{
if(array[x]>array[y])
{
int tmp=array[x];
array[x]=array[y];
array[y]=tmp;
}
}
void merge_algo(int &left, int &right_begin, int &right)
{
int iter,iter_left=left,iter_right=right_begin;
for(iter=left;iter<=right;++iter)
{
if( (iter_right>right) || ((iter_left < right_begin) && (array[iter_left]<=array[iter_right])))
{
scratch[iter]=array[iter_left];
++iter_left;
}
else
{
scratch[iter]=array[iter_right];
++iter_right;
}
}
for(iter=left;iter<=right;++iter){array[iter]=scratch[iter];}
}
void merge_recurse(int left,int right)
{
int left_end=(left+((right-left)/2));
int right_begin=left_end+1;
if(((left+1)==right)){flip_if_unordered(left,right);return;}
else if ((left==right)){return;}
else
{
merge_recurse(left,left_end);
merge_recurse(right_begin,right);
merge_algo(left,right_begin,right);
}
}
public:
merge_inner()
{
scratch = new T[size]();
if(scratch != NULL){merge_recurse(0, size);}
}
};
/*Quick Sort
void quick_sort()
{
quick_recurse(0,size);
}
void quick_recurse(int left, int right)
{
int l = left, r = right, tmp;
int pivot = array[(left + right) / 2];
while (l <= r)
{
while (array[l] < pivot)l++;
while (array[r] > pivot)r--;
if (l <= r)
{
tmp = array[l];
array[l] = array[r];
array[r] = tmp;
l++;
r--;
}
}
if (left < r)quick_recurse(left, r);
if (l < right)quick_recurse(l, right);
}
*/
把你的声明和实现分开。
在你的dynamic_array
中,有这样的代码:
// Declare, but don't implement yet
dynamic_array(int sizein);
merge_sort();
然后,在声明了merge_inner
之后,在文件的更下方放置前面声明的函数的实现:
dynamic_array::dynamic_array(int sizein)
{
size=sizein;
array=new T[size]();
}
dynamic_array::merge_sort()
{
merge_inner<T> M1;
}
它们甚至可以在一个单独的文件中,在文件的末尾包含#。这样,您的接口易于阅读,并且您的实现是分离出来的。
您必须在定义dynamic array
之前添加merge_inner
模板的前向声明:
template <typename> class merge_inner;
注意,这就足够了,即使模板还没有定义,你也可以声明merge_inner<T> M1;
。这是因为dynamic_array
本身就是一个模板,只有当外部模板本身实例化时才需要完整的merge_inner<T>
类型。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 功能原型的目的
- getline() 的原型/库是什么;
- 具有enable_if外部类原型的模板类构造函数定义
- 函数如何通知用户它基于函数原型抛出异常?
- 在C++中包含原型文件的正确方法是什么?
- 在函数中拥有函数原型的目的是什么?
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以使用 libclang python 解析 cpp 文件中没有标头的函数原型
- 如果原型是本地的,则使用流 I/O C++类型约束将失败
- 如何进行原型消息交叉引用?
- 有没有办法在C++编译时更改函数原型?
- 省略函数原型中的返回类型
- 在 linux 原因上运行自定义原型插件
- 为什么以及如何使用原型设计模式
- 您是否必须随项目一起交付原型文件?
- 如何在C++中遍历谷歌原型地图?
- 错误:'EM::EM(...)' 的原型与类 'EM' 中的任何原型都不匹配
- 功能原型,没有定义
- 是类原型的必要条件