C++ C++;逻辑错误:试图为所有创建的实例生成唯一的ObjectID,计数器注册错误

C++ C++;逻辑错误:试图为所有创建的实例生成唯一的ObjectID,计数器注册错误,c++,hitcounter,static-data,C++,Hitcounter,Static Data,我正在从事一个项目,该项目必须允许创建的所有实例都具有唯一的对象。所有类都继承自一个基类,该基类具有一个静态变量,该变量在调用任何具体类构造函数时递增。计数器一直运行,直到程序退出 计数; ++这个->对象; 返回(此->对象); } void IBase::decrementCount() { --这个->计数; } //=========================================================================== A.h级混凝土 具体类

我正在从事一个项目,该项目必须允许创建的所有实例都具有唯一的对象。所有类都继承自一个基类,该基类具有一个静态变量,该变量在调用任何具体类构造函数时递增。计数器一直运行,直到程序退出

<我的问题是当我使用数组(任何C++容器)时,ObjID寄存器会增加一个增量。 例如: 在我的
main()
中,我创建了一个
向量cc
并向后推了两次(…)

我的产出是:

objID = 5, and count = 2
预期结果:

objID = 2, and count = 2
我不知道为什么我的
ObjID
每次
push_back(…)
都要注册一次以上。我已经检查了所有位置,以确保我的
assign()
只在我的具体类的构造函数中调用

请告知

//===========================================================================   
//Main.cpp

#include "ConcreteClassA.h";

#include <iostream>
#include <vector>
#using namespace std;

int main()
{
    vector<ConcreteClassA> c1;
    cc.push_back( ConcreteClassA() );
    cc.push_back( ConcreteClassA() );

    return 0;
}

    //objID is off for some reason....
    //Expected Results: count = 2, objID = 2
    //Output: count = 2, objID = 5

//===========================================================================
//IBase.h file
private: 
    static int objID;      //used to assign unique IDs
    static int count;      //track how many stances of all objs are active

protected:        
    const int assignID();  //return a new ID
    void decrementCount(); //decrement count, when an obj is removed
//===========================================================================

//IBase.cpp
int IBase::objID = 0;
int IBase::count= 0;

const int IBase::assignID()
{
    ++ this->count;
    ++ this->objID;

    return ( this->objID );
}

void IBase::decrementCount()
{
    -- this->count;
}

//===========================================================================
ConcreteClassA.h

ConcreteClassA();     //default constructor
ConcreteClassA(...);  //couple overloaded constructors
~ConcreteClassA();    //destructor

ConcreteClassA( const ConcreteClassA &cc );           //copy constructor
ConcreteClassA& operator=(const ConcreteClassA &cc);  //assignment operator

//more methods....

//===========================================================================
ConcreteClassA.cpp

//destructor makes sure instances tracking counter is decremented
ConcreteClassA::~ConcreteClassA()
{
    this->decrementCount();
}

//only constructors and assignemnt operators call assign() method
ConcreteClassA::ConcreteClassA()
{
    //some other initialization...
    this->assignID();
}
//All other methods implementation left out for sensitivity of real estate...
/===================================================================================================================================================================================================================================================================================================================================================================================================
//Main.cpp
#包括“A.h级混凝土”;
#包括
#包括
#使用名称空间std;
int main()
{
向量c1;
cc.推回(ConcreteClassA());
cc.推回(ConcreteClassA());
返回0;
}
//objID因为某种原因关闭了。。。。
//预期结果:count=2,objID=2
//输出:计数=2,对象=5
//===========================================================================
//IBase.h文件
私人:
静态内部对象//用于分配唯一ID
静态整数计数//跟踪所有OBJ中有多少个姿态处于活动状态
受保护的:
常量int assignID()//返回一个新的ID
无效递减计数()//删除obj时的递减计数
//===========================================================================
//IBase.cpp
intibase::objID=0;
intibase::count=0;
常量int-IBase::assignID()
{
++这个->计数;
++这个->对象;
返回(此->对象);
}
void IBase::decrementCount()
{
--这个->计数;
}
//===========================================================================
A.h级混凝土
具体类别a()//默认构造函数
a类(……)//耦合重载构造函数
~classa()//析构函数
混凝土等级A(施工混凝土等级A和cc)//复制构造函数
ConcreteClassA和运算符=(const ConcreteClassA和cc)//赋值运算符
//更多方法。。。。
//===========================================================================
C类A.cpp
//析构函数确保实例跟踪计数器递减
ConcreteClassA::~ConcreteClassA()
{
此->递减计数();
}
//只有构造函数和assignemnt运算符调用assign()方法
ConcreteClassA::ConcreteClassA()
{
//其他一些初始化。。。
此->assignID();
}
//所有其他因房地产敏感性而遗漏的方法实施。。。

您必须考虑对象的副本。在C++ >代码> vector::PuxOffBeD()/Cuff>将对象的副本放入向量中。在函数调用中创建的临时实例将被销毁。这就是为什么“已创建”计数高于“活动”计数的原因

如果你真的想在创建对象实例时小心谨慎,也许你应该在向量中存储指针。这样,您必须显式地创建和销毁它们

下面是一篇关于类似的文章:

哇,我还没有检查操作符的优先级,但我会写

void IBase::decrementCount()
{
    -- (this->count);
}
连想都没想。(一个很好的指导原则是,如果你有疑问或想检查,你应该写得更清楚)

而且,是的,应该是这样


使用
过度使用的方式会导致故障!静态成员不依赖于实例:-)是的,我知道静态变量不依赖于“this”。我用过的帖子很清楚,方法是从哪里来的。使用“this”不应影响结果,这些方法是实例方法。如果在一次运行期间它们只需要在活动对象中是唯一的,则可以使用地址(
&instance
this
)。无论哪种方式,如果数字可读性不够,您可以将任何32位地址(或计数器)编码为
/usr/share/dict/words
(或任何其他包含2^16个条目的单词列表)中的两个英文单词。@badboy11否。这与std::vector的工作方式有关。如果不希望允许对象的副本,则通过将其设为私有来隐藏复制构造函数和赋值运算符。但是你不能使用std::vector。您需要决定您的物品计数系统将如何处理副本。谢谢您先生为我指出了正确的方向。我刚刚开始使用Boost库。我非常喜欢它。你能给我指一下有例子可供学习的任何地方吗?Boost.org目前对我来说不是那么直观。不要试图了解全部内容。只要找出能帮助你的部分。和使用
void IBase::decrementCount()
{
    -- (this->count);
}
void IBase::decrementCount()
{
    --count;
}