我可以在同一个类中创建对象吗?
Posted
技术标签:
【中文标题】我可以在同一个类中创建对象吗?【英文标题】:Can I create object in the same class? 【发布时间】:2013-10-07 12:16:03 【问题描述】:我可以在同一个类中创建一个类的对象吗? 如果不行我该怎么办?
示例堆栈类
template <class T>
class stack
void push(T d)
...
T pop()
...
//my question is about this one
void sort()
// I get errors when I do that ?
stack st;
st.push(4);
;
【问题讨论】:
你想用你的排序方法做什么?如果你想使用你的类,你应该创建该类的实例stack
需要用stack<T> st;
类型实例化
你遇到了什么错误?
真正的问题是什么?这有帮助吗? ***.com/questions/9902384/…
【参考方案1】:
没有模板也可以,例如
class stack
public: //<-- added so we can use this
void push(int d)
//...
int pop()
//...
void sort()
stack st;
st.push(4);
;
现在,在您的模板化案例中,您将需要告诉排序函数要创建什么样的堆栈。
void sort()
stack<T> st;
//---^^^
st.push(4);
更多编辑 第 14.6.1 节
"注入的类名可以带或不带 模板参数列表。当它没有使用时 模板参数列表,相当于注入的类名 后跟包含在中的类模板的模板参数 。”
所以,你可以说stack st;
但是,您将无法拥有stack<T>
类型的成员变量。
【讨论】:
【参考方案2】:在一个类中创建一个相同类型的对象是完全可以的。你应该可以让它与stack<T>
一起工作,就像这样
template <class T>
class stack
...
void sort()
stack<T> st;
st.push(4);
...
;
根据最新的 C++ 标准,stack st;
似乎是正确的,但可能你的编译器还没有实现这部分 C++ 标准。
话虽如此,但从您发布的代码中并不清楚为什么这是一个模板。如果它是我希望看到的模板
void push(const T& x)
...
T pop()
...
等等。您确定要将此作为模板吗?您应该正确或根本不这样做。
【讨论】:
我想知道排序如何尝试与st
交换自己
我认为第 14.6.1 节意味着我们错了,并且在 VS2012 上没有 T
和 const T&
都是正确的。但是通过使用const T&
,当您将某些东西压入堆栈时,您可以避免制作额外的 T 副本。 T 可以是任何东西,它可能是复制效率非常低的东西。所以这就是为什么在这种代码中最好使用const T&
作为函数参数。以上是关于我可以在同一个类中创建对象吗?的主要内容,如果未能解决你的问题,请参考以下文章