在您将此问题标记为重复之前,请注意我确实查看过该网站上的this帖子和其他类似帖子。我的问题不在于理解变量范围和/或预处理器的工作原理。我已经把它们弄下来了。
我在代码中无法弄清楚这个讨厌的问题。我只是想用C ++建模堆栈数据结构。编译器一直抱怨size
和capacity
未在此范围内声明(Stack.cpp
)。有三个文件:
以下是头文件和.cpp文件的代码片段:
Stack.h
#ifndef STACK_H_
#define STACK_H_
#include <iostream>
#include <string>
using namespace std;
template<typename T>
class Stack
{
public:
Stack();
void push(T item);
T pop();
private:
int size;
const int capacity = 10;
T items[];
};
#endif
Stack.cpp
#include "Stack.h"
using namespace std;
template<typename T>
Stack::Stack() : items[capacity]
{
size = 0;
}
template<typename T>
void Stack::push(T item)
{
if(size == capacity)
{
cout << "No more room left. Unable to add items.";
}
else
{
items[size-1] = item;
size++;
}
}
template<typename T>
T Stack::pop()
{
if(size == 0)
{
cout << "Stack is empty. There is nothing to remove.";
}
else
{
size--;
}
}
编译器也奇怪地抱怨“'模板类Stack'没有模板参数使用void Stack :: push(T item)”,这没有多大意义,看我是怎么在成员之前使用模板头的功能
有人可以澄清我做错了吗?
答案 0 :(得分:1)
我解决了你的问题,解决了一些问题并进行了优化(只是推荐),所以:
现在进行优化:
代码(Stack.h):
#ifndef STACK_H_
#define STACK_H_
#include <iostream>
#include <memory> // for unique_ptr
//using namespace std; // it is better to not use using namespace, for avoiding of problems in the future
template<typename T>
class Stack {
public:
Stack(const unsigned int& capacity = 10); // usually stacks are defined with user settable capacity
void push(T item);
T pop();
private:
unsigned int size;
unsigned int capacity;
std::unique_ptr<T[]> items;
};
// such templated functions (below) cannot be implemented in other file
template<typename T>
Stack<T>::Stack(const unsigned int& capacity) :
capacity(capacity),
items(new T[capacity]),
size(0) {}
template<typename T>
void Stack<T>::push(T item) {
if (size == capacity) {
std::cout << "No more room left. Unable to add items." << std::endl;
}
else {
items[size++] = item; // you should put item at index size, after that increase it by one
}
}
template<typename T>
T Stack<T>::pop() {
// for such defined function you need to return something of type T
if (size == 0) {
std::cout << "Stack is empty. There is nothing to remove." << std::endl;
return 0; // maybe return empty object?
}
else {
return items[--size]; // probably return removed object
}
}
#endif
代码(main.cpp):
#include "Stack.h"
int main() {
Stack<int> stack;
for (int e = 0; e < 11; e++) {
stack.push(e);
}
for (int i = 0; i < 11; i++) {
std::cout << stack.pop() << std::endl;
}
return 0;
}
希望这有帮助。
答案 1 :(得分:0)
编译器也奇怪地抱怨“'模板类Stack' 没有模板参数使用void Stack :: push(T item)“
我认为编译器试图告诉您在cpp文件中使用了Stack
,您应该使用Stack<T>
。例如,您的push
声明应如下所示......
template<typename T>
void Stack<T>::push(T item)
// ... etc ...