【问题标题】:Copy member function with template class使用模板类复制成员函数
【发布时间】:2013-10-31 03:23:31
【问题描述】:

我的成员函数有问题。

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

            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
            };

这是我的构造函数和复制函数:

            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;
            }

我遇到的错误是错误错误 C4700:使用了未初始化的局部变量“setCopy” 和 C4700:使用了未初始化的局部变量“temp” 我已经尝试了各种去影响的方法等,但我无济于事。

【问题讨论】:

  • 隐藏该方法的前提是一个糟糕的想法,T** setCopy = new T*[setSize] 可能会让您更接近。您还应该考虑使用setCopy[i] = new T(*(set[i])); 作为循环中的唯一语句,尽管正如我所说,这种方法甚至没有被公开。如果您的目标是创建集合的副本,则创建 Set&lt;T&gt; 的副本,而不仅仅是底层指针数组的快照。此外,此类具有动态成员,并且没有复制构造函数或赋值运算符重载,因此您实际上是在玩等待发生的事故。

标签: c++


【解决方案1】:

这里有一些问题。

首先,您需要在使用 setCopy 变量之前对其进行初始化。

 T** setCopy = new (T*)[setSize]

可能是你想要的;这表示setCopy 指向setSize 指向-T 的数组。只有在那之后,你才能告诉它setCopy 的任何成员都指向T 的数组。 (你也需要在你的默认构造函数中做同样的事情)。

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

Set<int> set2 = set1;

并让它做正确的事。

【讨论】:

  • 我明白了...是的,这是我第一次使用模板。我只想要一个可以传递给数组的指针,而不是指向数组的指针。感谢您的澄清。我应该能够完成它。
  • @NarayanaJamesEmery:提示:数组不是指针。指向数组的指针通常只是指向数组中第一个对象的指针。
【解决方案2】:

setCopy 实际上是未初始化的...想想 在T** setCopy;之后 它指向哪里?

【讨论】:

  • 不会 T** setCopy 指向一个指针,setCopy[i] = new T; 通过使用 [i] 取消引用来生成动态 T?这让我很好奇正常的集合是如何工作的;
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
相关资源
最近更新 更多