矢量无法正确创建对象

Vector doesn't create objects properly

本文关键字:创建对象      更新时间:2023-10-16

我创建了一个包含一些静态数据的类。类似这样的东西:

class Object
{
public:
    Object();
    Object( Point center, double area );
    Object( int cx, int cy, double area );
    ~Object();
    //and other public stuffs here...
private:
    Point center;
    double area;
    static double totalArea;
    static int objCounter;
    static double areaMean;
};

比我做的构造函数和析构函数:

Object::Object()
{
    this->setCenter( Point() );
    this->setArea( 0.0 );
    objCounter++;
    totalArea += 0;
    areaMean = totalArea / objCounter;
}
/*this is just the default constructor I 
have two others that increment real area, not 0*/ 
Object::~Object()
{
    //cout << "Destructor called!n"; //put it just to test
    objCounter--;
    totalArea -= this->area;
    areaMean = totalArea / objCounter;
}

所以我的意图是知道创建了多少个对象,它的总面积和平均面积。我用简单的语句进行了测试,比如:

Object first;
Object second;
cout << Object::getObjCounter() << "n"; 
///I have the get method implement origanally

一切都很好。对象类正确计算实例数。我使用简单的数组进行了测试:

Object test[ 10 ];
cout << Object::getObjCounter() << "n";

太神奇了。。。它应该起作用;我测试了动态分配:

Object *test = new Object[ 10 ];
cout << Object::getObjCounter() << "n";
delete [] test;

再次。。。它是有效的。但当我尝试时:

vector< Object > test( 10, Object() );
cout << Object::getObjCounter() << "n";

它在stdout中给了我零。。。我把标志放在构造函数和析构函数中,看看为什么会发生这种情况。它告诉我,当我使用所示的向量语句时,构造函数只在打开时调用,而析构函数则按顺序调用!!!!为什么?对我来说没有意义!有人能向我解释一下吗?此外,有人能帮助我使用向量来实现与简单数组相同的效果吗?这意味着:在某个物体内部有一堆物体,并正确计数?问题是我需要向量功能,比如删除和添加元素,以及调整大小,但我不想重新发明轮子。提前谢谢。

您需要为Object类定义一个复制构造函数。http://www.cplusplus.com/articles/y8hv0pDG/

sudopunk是正确的,您需要一个复制构造函数。然而,遵循规则并定义一个副本分配运算符也是一种很好的做法:

如果您有析构函数、复制构造函数或复制赋值运算符,则应该显式声明这三个运算符。

以下是如何定义它们:

Object& operator=(const Object& rhs);
Object(const Object&);

请注意,复制构造函数、复制赋值运算符和析构函数对于任何类都非常重要,这些类的成员/资源是在堆上动态分配到其他地方的。隐式复制构造函数和赋值运算符只执行对象的成员复制。

另一个优化是应用移动语义,但这是另一回事,它不在本线程的范围内。