矢量无法正确创建对象
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&);
请注意,复制构造函数、复制赋值运算符和析构函数对于任何类都非常重要,这些类的成员/资源是在堆上动态分配到其他地方的。隐式复制构造函数和赋值运算符只执行对象的成员复制。
另一个优化是应用移动语义,但这是另一回事,它不在本线程的范围内。
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何创建对象函数指针C++映射?
- C++创建对象数组
- 在 C++ 的 Switch Case 中创建对象后对对象调用方法
- 如何获取在 main() 函数中构造的类的创建对象?
- 基于文件中的条目创建对象
- 错误:创建对象后无法分配区域
- C++ 通过输入创建对象
- 堆还是堆栈用于创建对象?
- 使用 C++ 创建对象数组
- 使用unique_ptr创建对象
- C++递归地在类构造函数中创建对象
- 通过向构造函数其他对象引用页面来创建对象
- ReactiveX (rx) - 在对象上应用可观察对象,而不是在可观察对象中创建对象
- 如何在OSX上正确创建C++对象文件(.o)
- 编译器是否会创建vtable,而不考虑在c++中创建对象
- 创建对象并防止被破坏
- 在C++中,友元类可以从友元类创建对象吗
- 只在堆中创建C++对象
- 创建用户定义的复制构造函数时无法创建对象