473,386 Members | 1,799 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

Problems storing objects in a vector and incrementing a staticcounter in C++

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<MyClassm;
m.resize(5);
for(i=0; i<5;i++)
{
m.at(i);
cout << endl << "LOOP"<<'\t';
m[i].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::DisplayMyClassObject()
{
cout <<"ID"<<setw(2)<<this->ID<<" Cn"<< setw(2)<< this-
>MyClassCounter <<endl;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MyClass.h: interface for the MyClass class.
//

#if !
defined(AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF 6E2694182__INCLUDED_)
#define AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF6E269418 2__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_8DF 6E2694182__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
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

-
Sep 3 '08 #1
3 1366
On Sep 3, 10:47*am, "Bruno.DiStefano" <Bruno.DiStef...@gmail.com>
wrote:
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<MyClassm;
* * * * m.resize(5);
* * * * for(i=0; i<5;i++)
* * * * {
* * * * * * * * m.at(i);
* * * * * * * * cout << endl << "LOOP"<<'\t';
* * * * * * * * m[i].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::DisplayMyClassObject()
{
* * * * cout <<"ID"<<setw(2)<<this->ID<<" *Cn"<< setw(2)<< this-
MyClassCounter <<endl;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// MyClass.h: interface for the MyClass class.
//

#if !
defined(AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF 6E2694182__INCLUDED_)
#define AFX_MYCLASS_H__CE1FCBB5_0FEC_4C67_97D2_8DF6E269418 2__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_8DF 6E2694182__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
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

-
Make sure you also implement a copy constructor and assignment
operator that increments the static count and assigns correct id to
the object.
Sep 3 '08 #2

Thank you to all who responded, i.e. Klaudiusz Baran on comp.lang.c++
& Chris Morley, Alberto Ganesh Barbati, Erik Wikström, Thomas Richter,
Ulrich Eckhardt, Hyman Rosen, and Maciej Sobczak on comp.lang.c+
+.moderated. All of you were right. Two comments in particular were
right:

//////
You should probably also consider getting a more recent compiler. VC
6.0 is ancient, and has a lot of defects - rather obsolete.
//////
First of all, there is absolutely no reason to write "this->" in the
member
function. Then, the copy constructor could be:
//////

As about the ancient compiler, you are very right. I have been saying
this for long time, but I inherited the code and I have to abide by
the rules of those who set the agenda. As about the this-in a member
function, again, you are right, but I have to abide by the coding
standard set by others.

As about this-being misleading with a static member variable you are
right. I should replace it with MyClass::

Thank you again.

Best regards

Bruno
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Sep 4 '08 #3
On Sep 4, 1:23 pm, "Bruno.DiStefano" <Bruno.DiStef...@gmail.com>
wrote:

[...]
//////
First of all, there is absolutely no reason to write "this->" in the
member
function. Then, the copy constructor could be:
//////

As about the this-in a member
function, again, you are right, but I have to abide by the coding
standard set by others.

Well, take the above words as general advice please,
special treatment needed, depends on what are you
actually doing.

If you write template code, sometimes you need to write
"this->" to deal with the name lookup issues for dependent
base classes. It is also true that for heavy templated code,
using "this->" for all possible situations, was recommended
by some template experts.

Regards,

Jiang
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Sep 5 '08 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Chester | last post by:
Is it possible to new an object A, downcast it to B, and store B in a vector? I'm having problem with the following code: B is a derived class of A Blist.push_back( new B() ); Blist.push_back(...
17
by: tuvok | last post by:
How can objects of different types be stored in a collection? For example: struct S1 { /*...*/ }; struct S2 { /*...*/ }; struct Sn { /*...*/ }; template<typename T> class X { public:
6
by: Alfonso Morra | last post by:
I have written the following code, to test the concept of storing objects in a vector. I encounter two run time errors: 1). myClass gets destructed when pushed onto the vector 2). Prog throws a...
12
by: Alfonso Morra | last post by:
I have the ff code for testing the concept of storing objects: #include <vector> #include <iostream> using namespace std ; class MyClass { public: MyClass(){
13
by: r.z. | last post by:
I logged construtor and destructor calls for one of my classes and I discovered that the constructor was called only once while the destructor was called 3 times for a single object. I have a...
6
by: kevin | last post by:
Hi All here is a problem I just can't understand! I don't really want a work around I just want this to plainly work or atleast explained.... Thanks in advance.... Problem: strcmp(st, s) it runs...
10
by: Jess | last post by:
Hello, I have a program that stores dynamically created objects into a vector. #include<iostream> #include<vector> using namespace std;
3
by: Ramon F Herrera | last post by:
Newbie alert: I come from C programming, so I still have that frame of mind, but I am trying to "Think in C++". In C this problem would be solved using unions. Hello: Please consider the...
4
by: alexjcollins | last post by:
The following program demonstrates the problem: #include <vector> #include <iostream> #include <tvmet/Vector.h> typedef tvmet::Vector<double, 3Vector3d; class Mesh {
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.