B
Bruno.DiStefano
Hi All,
BACKGROUND INFO
I need to use a "vector" structure to store a number of objects that
becomes known only at run time. The constructor, at instantiation time
of a new object, increments a static counter. The value of this
counter becomes the ID of the object that has just been instantiated.
I am using Visual C++ 6.0 and, for this project, in the short term I
have no options about this.
PROBLEM
I have done this countless times in the past (90s) with large number
(100+) of objects without using a vector. Now I need to be able to
handle a much higher number (>10000) of objects. I need the use of a
vector because I need to run various loops on all objects. When I do
it, it does not work.
MY CODE
==============
I am showing below:
1) File TestOne.cpp
2) File MyClass.cpp
3) File MyClass.h
4) Screen dump of execution
WHAT I GET
=========
It seems that the static counter is not accessible from within the
vector. See "4) Screen dump of execution". Actually, it seems that the
static counter is accessed once and never again.
QUESTIONS
==========
1) Am I doing something wrong? What?
2) Can anybody be so kind to show me the correct code?
3) If, for whatever reason, it cannot be done using a vector, what can
I do?
Thank you.
Best regards
Bruno
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// TestOne.cpp
//
#include "MyClass.h"
#include <iostream>
#include <iomanip>
#include <vector>
using std::cout;
using std::setw;
using std::endl;
int main(int argc, char * argv[])
{
int i=0;
MyClass m1, m2, m3;
cout << endl <<endl;
std::vector<MyClass> m;
m.resize(5);
for(i=0; i<5;i++)
{
m.at(i);
cout << endl << "LOOP"<<'\t';
m.DisplayMyClassObject();
}
cout << endl << endl;
return (0); // this should not be always 0
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MyClass.cpp
//
#include "MyClass.h"
#include <iostream>
#include <iomanip>
using std::cout;
using std::setw;
using std::endl;
int MyClass::MyClassCounter=0;
MyClass::MyClass()
{
this->MyClassCounter++;
this->ID = this->MyClassCounter;
cout << endl <<"CONSTRUCTOR"<<'\t';
this->DisplayMyClassObject();
}
MyClass::~MyClass()
{
this->MyClassCounter--;
cout << endl <<"DESTRUCTOR"<<'\t';
this->DisplayMyClassObject();
}
void MyClass:isplayMyClassObject()
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MyClass.h: interface for the MyClass class.
//
#if !
defined(AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF6E2694182__INCLUDED_)
#define AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF6E2694182__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class MyClass
{
public:
void DisplayMyClassObject(void);
MyClass();
virtual ~MyClass();
private:
int ID;
static int MyClassCounter;
};
#endif // !
defined(AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF6E2694182__INCLUDED_)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CONSTRUCTOR ID 1 Cn 1
CONSTRUCTOR ID 2 Cn 2
CONSTRUCTOR ID 3 Cn 3
CONSTRUCTOR ID 4 Cn 4
DESTRUCTOR ID 4 Cn 3
LOOP ID 4 Cn 3
LOOP ID 4 Cn 3
LOOP ID 4 Cn 3
LOOP ID 4 Cn 3
LOOP ID 4 Cn 3
DESTRUCTOR ID 4 Cn 2
DESTRUCTOR ID 4 Cn 1
DESTRUCTOR ID 4 Cn 0
DESTRUCTOR ID 4 Cn-1
DESTRUCTOR ID 4 Cn-2
DESTRUCTOR ID 3 Cn-3
DESTRUCTOR ID 2 Cn-4
DESTRUCTOR ID 1 Cn-5
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
BACKGROUND INFO
I need to use a "vector" structure to store a number of objects that
becomes known only at run time. The constructor, at instantiation time
of a new object, increments a static counter. The value of this
counter becomes the ID of the object that has just been instantiated.
I am using Visual C++ 6.0 and, for this project, in the short term I
have no options about this.
PROBLEM
I have done this countless times in the past (90s) with large number
(100+) of objects without using a vector. Now I need to be able to
handle a much higher number (>10000) of objects. I need the use of a
vector because I need to run various loops on all objects. When I do
it, it does not work.
MY CODE
==============
I am showing below:
1) File TestOne.cpp
2) File MyClass.cpp
3) File MyClass.h
4) Screen dump of execution
WHAT I GET
=========
It seems that the static counter is not accessible from within the
vector. See "4) Screen dump of execution". Actually, it seems that the
static counter is accessed once and never again.
QUESTIONS
==========
1) Am I doing something wrong? What?
2) Can anybody be so kind to show me the correct code?
3) If, for whatever reason, it cannot be done using a vector, what can
I do?
Thank you.
Best regards
Bruno
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// TestOne.cpp
//
#include "MyClass.h"
#include <iostream>
#include <iomanip>
#include <vector>
using std::cout;
using std::setw;
using std::endl;
int main(int argc, char * argv[])
{
int i=0;
MyClass m1, m2, m3;
cout << endl <<endl;
std::vector<MyClass> m;
m.resize(5);
for(i=0; i<5;i++)
{
m.at(i);
cout << endl << "LOOP"<<'\t';
m.DisplayMyClassObject();
}
cout << endl << endl;
return (0); // this should not be always 0
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MyClass.cpp
//
#include "MyClass.h"
#include <iostream>
#include <iomanip>
using std::cout;
using std::setw;
using std::endl;
int MyClass::MyClassCounter=0;
MyClass::MyClass()
{
this->MyClassCounter++;
this->ID = this->MyClassCounter;
cout << endl <<"CONSTRUCTOR"<<'\t';
this->DisplayMyClassObject();
}
MyClass::~MyClass()
{
this->MyClassCounter--;
cout << endl <<"DESTRUCTOR"<<'\t';
this->DisplayMyClassObject();
}
void MyClass:isplayMyClassObject()
{
}cout said:MyClassCounter <<endl;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MyClass.h: interface for the MyClass class.
//
#if !
defined(AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF6E2694182__INCLUDED_)
#define AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF6E2694182__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class MyClass
{
public:
void DisplayMyClassObject(void);
MyClass();
virtual ~MyClass();
private:
int ID;
static int MyClassCounter;
};
#endif // !
defined(AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF6E2694182__INCLUDED_)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CONSTRUCTOR ID 1 Cn 1
CONSTRUCTOR ID 2 Cn 2
CONSTRUCTOR ID 3 Cn 3
CONSTRUCTOR ID 4 Cn 4
DESTRUCTOR ID 4 Cn 3
LOOP ID 4 Cn 3
LOOP ID 4 Cn 3
LOOP ID 4 Cn 3
LOOP ID 4 Cn 3
LOOP ID 4 Cn 3
DESTRUCTOR ID 4 Cn 2
DESTRUCTOR ID 4 Cn 1
DESTRUCTOR ID 4 Cn 0
DESTRUCTOR ID 4 Cn-1
DESTRUCTOR ID 4 Cn-2
DESTRUCTOR ID 3 Cn-3
DESTRUCTOR ID 2 Cn-4
DESTRUCTOR ID 1 Cn-5
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-