Two problems.
As others have pointed out, the class name is the same as the variable. I'm not so sure you can do that or it will even compile. My compiler certainly doesn't like it.
I suggest you name your classes like with an uppercase starting letter and an upper case letter for every word in the class. All other letters lower case. e.g. Collisions & Score. or CompactDisk etc.
Second problem is that collisions doesn't know anything about the variable score that you've declared globally.
What you need to do is change the collisions constructor to take a score reference variable like this:
class collisions
{
public:
collisions(score &score);
int lasers();
protected:
score& score_;
}
collisions(score& score)
: score_(score) { }
Now lasers should reference the score member variable
score_.scored(100);
And you'll need to change the global variables like this:
score the_score;
collisions the_collisions(the_score);
That is of course assuming you're only wanting ONE copy of score. If you're wanting one copy of score per collisions class then you'll not have a score global variable, but simply remove the '&' from the member variable score_ and remove the constructor function that takes a reference.
And by the way.
score.scored(100); // wrong... doesn't know anything about score, not in scope yet.
score::scored(100); // wrong. scored member isn't declared as static.