C++ 使用模板类复制成员函数

C++ 使用模板类复制成员函数,c++,C++,我的会员功能有问题 我的目标是创建集合的副本,并返回指向它的指针 template <class T> class Set { public: Set(int length = 0); //Default constructor ~Set(); //Defualt Destructor

我的会员功能有问题

我的目标是创建集合的副本,并返回指向它的指针

            template <class T>
            class Set
            {
            public:
                Set(int length = 0);     //Default constructor
                ~Set();              //Defualt Destructor
                int size();          //Return how many elements are in set
                bool contains(T test);   //Searches set for T
                bool add(T adding);      //Adds T to set, repeats are denied
                bool remove(T removing); //Attempts to remove T
                T** elements();      //Returns a pointer to the set
                T** copy();          //Creates a copy of the set, and returns a pointer to it
                T &operator[](int sub);  //Overload subscript

            private:
                T** set;        //Pointer to first of set
                int setSize;        //Int holding amount of Elements available
                int holding;        //Elements used
                void subError();    //Handles Subscript out of range
                void adder();       //returns a copy with +1 size
            };
模板
类集
{
公众:
Set(int length=0);//默认构造函数
~Set();//解除析构函数
int size();//返回集合中的元素数
bool包含(T test);//搜索T的集合
bool add(T adding);//将T添加到集合中,重复被拒绝
bool remove(T removing);//尝试删除T
T**elements();//返回指向集合的指针
T**copy();//创建集合的副本,并返回指向该集合的指针
T运算符[](int-sub);//重载下标
私人:
T**set;//指向集合第一个的指针
int setSize;//可用元素的int持有量
int holding;//使用的元素
void subError();//处理的下标超出范围
void adder();//返回大小为+1的副本
};
这是我的构造函数和复制函数:

            template <class T>
            Set<T>::Set(int length) //Default constructor
            {
                for(int i = 0; i < length; i++)
                {
                    set[i] = new T;
                }
                setSize = length;
                holding = 0;
            }

            template <class T>
            T** Set<T>::copy()  //Creates a copy of the set, and returns a pointer to it
            {
                T** setCopy;
                for(int i = 0; i < setSize; i++)
                {
                    setCopy[i] = new T;
                    *setCopy[i] = *set[i];
                }
                return setCopy;
            }
模板
Set::Set(int-length)//默认构造函数
{
for(int i=0;i
有错误,我得到一个错误错误C4700:使用了未初始化的局部变量“setCopy” 和C4700:使用未初始化的局部变量“temp”
我已经尝试了各种解除干扰的方法,但是我没有取得任何进展。

setCopy实际上是未初始化的…想想看 在
T**setCopy之后

它指向何处?

setCopy实际上未初始化…请考虑 在
T**setCopy之后

它指向哪里?

这里有一些问题

首先,在使用变量之前,需要初始化
setCopy
变量

 T** setCopy = new (T*)[setSize]
也许是你想要的;这表示
setCopy
指向指向-
T
setSize
指针数组。只有在这之后,您才能告诉它,
setCopy
的任何成员都指向
T
的数组。(您也需要在默认构造函数中执行同样的操作)

但是,如果您想要创建集合的副本,那么您应该编写一个复制构造函数和赋值运算符,而不是编写
copy
方法,这样您就可以编写

Set<int> set2 = set1;
Set set2=set1;

让它做正确的事情

这里有一些问题

首先,在使用变量之前,需要初始化
setCopy
变量

 T** setCopy = new (T*)[setSize]
也许是你想要的;这表示
setCopy
指向指向-
T
setSize
指针数组。只有在这之后,您才能告诉它,
setCopy
的任何成员都指向
T
的数组。(您也需要在默认构造函数中执行同样的操作)

但是,如果您想要创建集合的副本,那么您应该编写一个复制构造函数和赋值运算符,而不是编写
copy
方法,这样您就可以编写

Set<int> set2 = set1;
Set set2=set1;

让它做正确的事情

确保该方法的前提是一个糟糕的想法,
T**setCopy=new T*[setSize]
可能会让你更接近。还应该考虑使用<代码> SETCOMP[i] =新T(*(set [i]));
是循环中唯一的语句,尽管如我所说,这个方法甚至不需要公开。如果目标是创建集合的副本,则创建集合的副本,而不仅仅是基础指针数组的快照。另外,这个类有动态成员,没有复制构造函数或赋值操作符重载,所以你实际上是在玩弄一个等待发生的意外。确保这个方法的前提是一个糟糕的想法,
T**setCopy=new T*[setSize]
可能会让你更接近。还应该考虑使用<代码> SETCOMP[i] =新T(*(set [i]));
是循环中唯一的语句,尽管如我所说,这个方法甚至不需要公开。如果目标是创建集合的副本,则创建集合的副本,而不仅仅是基础指针数组的快照。另外,这个类有动态成员,没有复制构造函数或赋值操作符重载,所以你实际上是在玩一个等待发生的意外通过与[i]解除引用生成动态T?这让我好奇正常的一套是如何运作的;不会**setCopy指向一个指针,该指针
setCopy[i]=new t通过与[i]解除引用生成动态T?这让我好奇正常的一套是如何运作的;我懂了。。。是的,这是我第一次使用模板。我只想要一个可以传递到数组的指针,而不是一个指向数组的点。谢谢你的澄清。我应该能够完成它。@NarayanaJamesEmery:Tip:数组不是指针。指向数组的指针通常只是指向数组中第一个对象的指针。。。是的,这是我第一次使用模板。我只想要一个可以传递到数组的指针,而不是一个指向数组的点。谢谢你的澄清。我应该可以完成它。@NarayanaJamesEmery:提示:数组不是po