【问题标题】:Is it possible to have a class member array with template elements是否可以有一个带有模板元素的类成员数组
【发布时间】:2013-12-15 18:48:17
【问题描述】:

我想知道是否可以有一个带有模板元素的类成员数组。我想要做的是如下所示。

#ifndef _STACK_H_
#define _STACK_H_

#include <exception>

using namespace std;

template<typename T>
class stack
{
 public:
  stack();
  void push(T data);
  void pop();
  T top();
  bool is_empty();
  bool is_full();

 private:
  int elem_max;
  int elem_num;
  T elem_array[elem_max];


};
#include "stack.template.cc"

#endif

然后在我的主程序中有类似的东西:

#include <iostream>

#include "stack.h"

using namespace std;

int main()
{
  stack<int> one;
  one.push(10);
  return 0;
}

这可能吗?

【问题讨论】:

  • 你为什么不试试呢?是的,有可能。
  • Re _STACK_H_,以下划线后跟大写字母开头的名称保留给实现。
  • 这是可能的,但您需要重新考虑上面示例中的elem_max
  • 另外,为了避免无意的名称冲突(例如,与std::distance 冲突),最好不要(阅读:“从不”)将using namespace std; 放在标头中的全局命名空间中。
  • 最后(这可能会导致信息溢出?),最好在纯访问器成员函数的末尾添加const,例如bool is_empty() const。这样可以在const 对象上调用此类函数。从而增加类的有用性。 :-)

标签: c++ arrays class templates stack


【解决方案1】:
template<typename T,size_t MAX_CAPACITY=16> //change 16 to whatever you want
class stack
{
public:
    stack();
    void push(const T &data);
    void pop();
    T& top();
    const T& top()const;
    bool is_empty()const;
    bool is_full()const;

private:
    size_t elem_num;
    T elem_array[MAX_CAPACITY];
};

int main()
{
    stack<int> one; //stack of ints with maximum capacity of 16
    one.push(10);

    stack<int,1024> two; //stack of ints with maximum capacity of 1024
    two.push(10);

    return 0;
}

【讨论】:

  • 非常感谢。同一个 T elem_array[] 中是否可以有不同类型的数据?
  • @Cooli 不,它们都必须是相同的类型,除非 T=some_base_class* 然后数组中可以包含 some_base_class* 和 some_derived_class* 。另外,如果这是您正在寻找的答案,您可以选择它作为答案吗?
【解决方案2】:

你可以这样做,因为模板在类被实例化之前被评估。为什么不用你的编译器来测试呢?

template <typename T>
class Stack
{
    static const size_t MAX_STACK = 1024; 
    T m_Buffer[MAX_STACK]; 
public:
    // ...
};

编译没有问题。

主要问题是,您需要在编译时确定数组的大小,而不是在运行时确定。在这里,我使用了static const 使其工作。如果你想要一个灵活的数组,可以考虑使用std::vectorstd::list 左右。

【讨论】:

  • 为了避免意外的文本替换,最好为宏名称保留全部大写,并将其用于所有宏名称,因为这是现在的通用约定。对常量使用这种约定是 Java 的事情,起源于早期的 C,它没有 const,因此必须将常量定义为宏。哦,讽刺的是……
  • @Cheersandhth.-Alf 即使在 C 中你也不能使用 const int A=10; int b[A];,因为 C const 机制不同于 C++ const 机制。
  • 非常感谢。同一个 T elem_array[] 中是否可以有不同类型的数据?
猜你喜欢
  • 2012-10-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多