【问题标题】:Assignment operator, using a dynamic array赋值运算符,使用动态数组
【发布时间】:2012-04-29 16:37:35
【问题描述】:

我有一个指向对象的指针列表。我想要做的是读取列表并将每个对象存储在该对象类型的动态数组中。所以我这样做:

int size = List.size();  // find how many objects in the list
ClassA* object = new ClassA[size];   // create a dynamic array
int counter = 0;
p = List.begin();   // iterator = begining of the list
while( p != List.end() )
{
    object[counter] = (*p)->operator=(*(*p));
                // called like this as this function is in a separate class
    p++;
    counter++;
}

这似乎是我想要的,这意味着我需要赋值运算符,但我对放入它的内容有点困惑,而且我遇到堆栈溢出错误,这是我认为我需要做的:

 ClassA ClassA::operator =(const ClassA& source)
 {
     ClassA* newObject;
     newObject = new ClassA;
     newObject = source;
     return newObject;

 }

这是一堆废话,我不知道,但在我的脑海中,这是我想要它做的,但我不完全理解我是如何实现它的。

如果有人可以提供帮助或建议更好的方法来实现我所需要的,我们将不胜感激。

这样做的原因是存储在此列表中的对象通常会遍历每一帧并复制到临时对象中。但是在程序运行过程中列表并没有改变,这意味着我不需要复制每一帧,只需在开始时复制一次。而且我需要一个动态数组,因为我不知道列表中将存储多少对象。

【问题讨论】:

  • 您的列表是否包含指针或实际对象? (即list<ClassA>list<ClassA*>)?
  • 抱歉应该让大卫布朗更清楚,它包含一个指针列表

标签: c++ operator-overloading operator-keyword dynamic-arrays


【解决方案1】:

这可能是一个operator= 实现:

ClassA &ClassA::operator =(const ClassA& source) {
    // check for self-assignment
    if(this != &source) {
        // copy instance variables.
        a = source.a; // for example...
    }
    // assignment always returns the lvalue
    return *this;
}

我不知道你ClassA的实例变量,所以你应该实现内部复制。

另一方面,在迭代列表时,您可以这样复制对象:

object[counter] = (**p);

(**p) 首先返回存储在迭代器中的指针,然后取消引用它。

【讨论】:

  • 这是否意味着我必须复制实例的每个变量,假设该类有 30 多个变量然后 a =source.a b = source.b 等等
  • 是的,您必须复制每个变量。无论如何,有一个默认的赋值运算符可以做到这一点。如果你的类在内部处理资源,比如指针、设备等,你应该只实现这个操作符。
  • 这很好,非常感谢fontanini,如果你不介意,你能解释一下内部处理资源的更多信息吗?我不太明白?
  • 我很高兴它有帮助。你可以阅读这个 stackoverflow 线程,它解释了何时应该实现复制赋值运算符和“三规则”:stackoverflow.com/questions/4172722/what-is-the-rule-of-three
  • 干杯,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 2017-11-21
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多