下面是一个使用数组实现堆栈的类模板:
#include <iostream>
using namespace std;
template <typename T>
class stack {
public:
stack (int priv_size) {
T a[priv_size];
top = 0;
}
stack (const stack &s) {
T b[priv_size];
for (top=0; top<s.priv_size; top++) {
b[top] = s.a[top];
}
top++;
}
~stack () {}
const stack& operator = (const stack &s) {
T b[s.priv_size];
for (top=0; top<s.priv_size; top++) {
b[top] = s.a[top];
}
top++;
}
bool empty () {
return top == 0;
}
void push (const T &x) {
a[top++] = x;
}
T pop () {
T c = a[--top];
return c;
}
int size () {
return priv_size;
}
friend ostream& operator << (ostream &out, const stack &s) {
int i;
out << "[";
for (i=0; i<s.top-1; i++) {
out << s.a[i] << ", ";
}
if (i == s.top-1) out << s.a[s.top-1];
out << "]";
return out;
}
private:
int priv_size;
int top;
T a[];
};
int main () {
stack<int> s(10);
cout << "stack s is empty: " << s << endl;
s.push(42);
s.push(17);
cout << "stack s has 2 elements: " << s << endl;
cout << "Removing " << s.pop() << " from the stack..." << endl;
return 0;
}
然而,当我在main
中尝试不同的类方法时,我意识到,尽管priv_size
在这里初始化为10的值:stack<int> s(10);
它在构造函数被称为后立即失去其值.
当我尝试在IDE中调试时,我意识到,一旦构造函数stack (int priv_size)
被调用,它创建了另一个变量priv_size
,该变量初始化为10的值,而不是使用类的priv_size
成员。前面的也可以在这里看到:
类成员priv_size内存地址(image)
:
不需要的变量priv_size内存地址(image)
,其中两个变量存储在不同的内存槽。
为什么这两个变量是不同的,为什么第二个图像中的一个是首先创建的?
我也尝试在类之外实现类方法,像这样:
stack<T>::stack (int priv_size) {
T a[priv_size];
top = 0;
}
但是我得到这两个错误消息:
Member declaration not found
Type 'T' could not be resolved
这是怎么回事?
提前感谢。
PS:我知道已经发布了一些非常相似的问题,但这些问题的答案似乎不适合我的问题,因为我的问题似乎是在类本身,而不是在main
或任何其他功能。这里有两个类似问题的链接:类成员丢失在成员函数中赋值在调用构造函数后丢失基类的数据成员
stack (int priv_size) { T a[priv_size]; top = 0; }
问题1:构造函数没有初始化成员a
。它创建一个本地数组。
问题2:数组的大小不是编译时常数。程序格式错误
问题3:您也没有初始化priv_size
成员。
private: int priv_size; int top; T a[];
问题4:没有指定数组成员a
的大小。程序格式错误
尽管priv_size在这里初始化为10的值:它在调用构造函数后立即失去其值。
你的假设是错误的。构造函数没有设置priv_size
成员的值,因此没有值丢失。
,其中两个变量存储在不同的内存槽中。
据我所知,一个变量是构造函数的参数,另一个是没有初始化的成员变量。
Type 'T' could not be resolved
这是怎么回事?
定义模板时,需要使用关键字template
并指定模板参数。例如:
template <typename T>
stack<T>::stack (int priv_size) {
为什么这两个变量不同,为什么首先创建第二个图像中的变量?
因为你声明了两个不同的变量。
struct foo {
int x;
foo(int a) {
int x = a;
}
};
foo
的构造函数声明了一个名为x
的局部变量,它遮蔽了成员x
,成员x
没有初始化。数组也一样:
struct bar {
int a[5];
bar() {
int a[5];
}
};
构造函数中的成员a
和a
是两个不同的数组。
这只是回答了你的问题,但你的代码中还有更多的问题。当你需要一个只有在运行时才知道大小的数组时,你应该使用std::vector
.
您的代码存在多个问题。例如,T a[priv_size];
要求priv_size
是编译时常数。在stack (const stack &s) {T b[priv_size];
中,当复制操作结束时,局部变量b
将超出作用域,而成员a
仍未初始化。