On Jul 16, 3:00 pm, Kai-Uwe Bux <jkherci...@gmx .netwrote:
mwel...@gmail.c om wrote:
I have been looking in the archives and as of yet have not found an
answer to my problem.
Class B has four members, and class A is derived from class B. Class
A only adds one new member to class B.
Class A has '<', '>', '==' and '=' overloaded, as well as a copy
constructor. Class B only has the copy constructor and assignment
operator overloaded.
I create a vector of A objects, and stuff them with random values.
When I sort the vector of A objects only the member unique to the A
object changes.
For example say I have three A objects in a vector blah
blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
I expect
blah[0] {one = 2 two = 0.7 three = 0.2 mysortvar = 0}
blah[1] {one = 5 two = 0.8 three = 0.1 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
but I get
blah[0] {one = 5 two = 0.8 three = 0.1 mysortvar = 0}
blah[1] {one = 2 two = 0.7 three = 0.2 mysortvar = 1}
blah[2] {one = 7 two = 0.6 three = 0.3 mysortvar = 3 }
Note:ONLY THE mysortvar values change.
could someone clue me into what I'm doing wrong?
Post at least the copy-constructors and assignment operators. My guess is
that at least one of them (for class A) does not forward the call to the
B-subobject. If I had to bet, I would venture the conjecture that the first
line is missing in A::operator=:
A & operator= ( A const & other ) {
B::operator=( other ); // assign the B subobject
mysortvar = other.mysortvar ; // assign the additional member
return ( *this );
}
Best
Kai-Uwe Bux
I'm in American Samoa and my internet connection is not what you would
call good, or even bad, its worse than bad. I'm having trouble
posting to this list so please forgive me if I reply more than once.
You are correct. To let you in on some more detail it is for a
genetic algorithm.
The base class is a "genome" and the derived class is an "individual .
Their overloaded assignment operators are posted below. As you can
see in the old version of the individual class assignment operator I
was copying all the members explicitly, and not using the base class
assignment operator. I'm not sure how these differ. I ran a test
with the newly suggested assignment operator and it works. Clearly,
there is something about the "sort", or other aspect of the STL I have
no idea about. If you have the time and would care to enlighten me I
would be grateful.
NNGenome & NNGenome::opera tor=(const NNGenome & oldNNG){
if(this != &oldNNG){ //Check for self assignment.
this->Epochs = oldNNG.Epochs;
this->LearnRate = oldNNG.LearnRat e;
this->Momentum = oldNNG.Momentum ;
this->NNStrDef = oldNNG.NNStrDef ;
}
return *this;
}
Individual & Individual::ope rator=(const Individual& GNN){
//check for self assigement.
if(this != &GNN){
this->BestFitness = GNN.BestFitness ;
this->Gepochs = GNN.Gepochs;
this->GlearnRate = GNN.GlearnRate;
this->Gmomentum = GNN.Gmomentum;
this->GnnStrDef = GNN.GnnStrDef;
}
return *this;
}
I switched the above to the following.
Individual & Individual::ope rator=(const Individual& GNN){
//check for self assigement.
if(this != &GNN){
NNGenome::opera tor=(GNN);
this->BestFitness = GNN.BestFitness ;
}
return *this;
}