2015-09-23 89 views
-1

我只是想对我的Stack的C++实现提供一些反馈。我知道这有点凌乱,但我正在尝试改进我使用类的方式。我很确定我没有正确使用模板。希望对堆栈实现有一些反馈C++

欢迎任何建议!

#include <iostream> 
#include </root/Dev/Stack.h> 
#include<string> 

using namespace std; 

template<class T> 
Stack<T>::Stack(T &size) 
{ 
    capacity = size; 

    if(size==0) 
    { 
     cout<<"Capacity can't be zero!"<<endl; 
     stack = 0; 
    } 
    else 
    { 
     stack = new T[capacity]; 
    } 

    count = -1; 
} 

template<class T> 
void Stack<T>::Insert(T &data) 
{ 
    if (count == (capacity-1)) 
    { 
     cout<<"Stack is full"; 
     return; 
    } 
    else 
    { 
     count++; 
     stack[count] = data; 
    } 
} 

template<class T> 
void Stack<T>::Display() 

{ 
    cout << "Printing out values:" << endl; 
    for (int i=0; i<count; i++) 
     cout << stack[i] << endl; 
} 

int main() 
{ 
    Stack<int> S1(5); 

    S1.Insert(10); 
    S1.Insert(22); 
    S1.Insert(5522); 
    S1.Display(); 

    Stack<string> S2(6); 
    S2.Insert("hi"); 
    S2.Insert("Savvy"); 
    S2.Insert("How are you?"); 
    S2.Display(); 

    return 0; 
    } 

头文件:

#include<iostream> 

using namespace std; 

template<class T> 
class Stack { 

public: 
    int capacity; 
    int count; 
    T *stack; 
    void Insert(T &num); 
    void Display(); 

    Stack(T &value); 
    }; 
+3

@CaptainObvlious请投票结束为“太宽泛”。投票结束,因为问题属于另一个网站并不是一个有效的密切原因。 –

+0

@EthanBierlein这肯定是一个有效的原因。这里只是关注主题,但在其他主题上。 –

+0

@KubaOber不,它*不是一个有效的密切原因。*如果有一个比它更好的并且已经内置的紧密原因,那么它应该被使用。 –

回答

0

我敢肯定,这不应该编译。您尚未在源文件中声明模板(这是一个奇怪的要求,请参阅:Why can templates only be implemented in the header file?)。这可以通过在int main之前添加template class Stack<int>;template class Stack<string>;来解决。

否则,如果添加一个析构函数(其主体基本上为delete[] stack;)并添加了一种从堆栈中移除的方法(这是通常的功能),这应该会很好地工作。

另外,考虑使T* stack私有封装。

最后,在insert中,请考虑在打印后抛出异常而不是返回。这对于在一个大项目中使用会更好。

除了模板声明问题之外,您对模板的使用非常好。

+0

我试过这样做,但仍然失败。我现在已经在头文件中实现了。此外,codereview上的人告诉我,不工作的代码是无题的:( –

0

有关Stack类模板的实现将无法正常工作,它在编译期间将失败。为什么?

任何类模板的声明和实现不能在.cpp和.h 2文件中分开,否则编译将失败。

因为模板类Stack {...} class T是任意的。如您所知,C++是一种静态语言,因此编译器需要知道在编译过程中应为每个数据(或对象)类型分配的确切内存大小。

但是类模板T是任意的,您不知道它在调用之前应该分配的确切内存大小。所以编译器无法初始化类模板对象。

而且所有编译器,无论它来自何处,Microsoft,ANSI,ISO,Google或GCC,都不能支持编译分离的模板代码。必须将所有模板(类模板和函数模板)的声明和实现写入头文件中。

如果你不相信,你可以去看看STL的源代码,所有的STLs都是在头文件中定义和实现的。

所以,你应该稍微纠正你的传统编程原则,将模板的声明和实现结合成一个头文件。

+0

我做过,但我仍然不知道为什么它不起作用。向我显示了很多链接器错误。 –