using the Wire library in different cpp files

I have two i2c sensors that I want to read a compass and a nintendo wii accelerometer.
For each of them I created a separate class with .h and .cpp files.
If I use only one of them, everything is fine. But as soon as I want to use both, none of them works.
I tried using the global extern Wire variable, or separate TwoWire member in the classes.
I rearranged the code back and forth. Whatever I do, one of them works, but not both ar the same time.
It’s my first project with i2c sensors. Are there special constraints one have to keep in mind?

The calling code is more or less like this:

#include <Servo.h> 
#include <Wire.h>
#include "RangeScanner.h"
#include "Compass.h"
#include "Nunchuck.h"
#include "IntersemaBaro.h"
#include "cppfix.h"

static const size_t pinIRDist    =   3;
static const size_t pinLED       =  11; // needs to be PWM
static const size_t pinServo     =   3; // needs to be PWM
static const size_t pinCompasPwr =   2;
#define USE_COMPASS
#define USE_ACCELERO
//#define USE_BARO

RangeScanner *rangescn = 0;
Compass      *compas   = 0;
Nunchuck     *nunchuck = 0;
Intersema::BaroPressure_MS5534C *baro = 0;
bool          doSendSerial = false;
bool          doSweepServo = false;
size_t        loopDelay    = 25;
char          tmptxt[128];

size_t readSerialString(char *txt, size_t bufsize);
void   evalCmdStr(char *txt);
 
void setup() 
{
    pinMode(pinCompasPwr, OUTPUT); 
    digitalWrite(pinCompasPwr, LOW);  
    delay(200);      
    digitalWrite(pinCompasPwr, HIGH);  
    delay(200);  
    Serial.begin(115200); // arduino bt has only this baud rate
//    Wire.begin();  // join i2c bus as for master
    rangescn = new RangeScanner(pinIRDist, pinServo); 
    rangescn->setStepAngle(5); 
    rangescn->setScanningRange(160);
#ifdef USE_COMPASS
    compas   = new Compass(-90); // 90° heading correction for the proto board
#endif
#ifdef USE_ACCELERO
    nunchuck = new Nunchuck();
    delay(100);
#endif
#ifdef USE_BARO
    baro     = new Intersema::BaroPressure_MS5534C(4, 5, 6, 7);
#endif
}
 
void loop() 
{

    const int proximityAngle = rangescn->curr_pos();
    const int proximityValue = rangescn->raw_measure();
    if(doSweepServo)
        rangescn->moveNextPos(); // move to the next scan position
        
#ifdef USE_ACCELERO
    const bool nunchuckSuccess = nunchuck->receiveData();
    const int accelX   = nunchuck->accelX();
    const int accelY   = nunchuck->accelY();
    const int accelZ   = nunchuck->accelZ();
#endif
#ifdef USE_COMPASS
    const int compassHeading = compas->heading();
#endif
//    const int altitude = baro->getHeightCentiMeters();

#ifdef USE_ACCELERO
    nunchuck->sendRequest();
#endif
    
    const int outputValue = map(proximityValue, 50, 700, 0, 255);
    analogWrite(pinLED, outputValue); 
    
    if(readSerialString(tmptxt, sizeof(tmptxt)))
        evalCmdStr(tmptxt);
    
    if(doSendSerial)
    {
        sprintf(tmptxt, "RA%dRV%d", proximityAngle, proximityValue);
        Serial.print(tmptxt);
#ifdef USE_ACCELERO
        sprintf(tmptxt, "AX%dAY%dAZ%d", accelX, accelY, accelZ);
        Serial.print(tmptxt);  
#endif
#ifdef USE_COMPASS
        sprintf(tmptxt, "CH%d", compassHeading);
        Serial.print(tmptxt);
#endif
#ifdef USE_BARO
        sprintf(tmptxt, "BH%d", altitude);
        Serial.print(tmptxt); 
#endif
  
        Serial.print("\n");
    }
    
    delay(loopDelay); 
}

If I enable only one of the two macros (USE_ACCELERO and USE_COMPASS), I get correct values when moving the sensors around. But when both macros are enabled, all I get is like this:

RA90RV609AX32AY8AZ752CH134
RA90RV608AX32AY8AZ752CH134
RA90RV602AX32AY8AZ752CH134
RA90RV592AX32AY8AZ752CH134
RA90RV584AX32AY8AZ752CH134
RA90RV583AX32AY8AZ752CH134
RA90RV571AX32AY8AZ752CH134
RA90RV559AX32AY8AZ752CH134
RA90RV552AX32AY8AZ752CH134
RA90RV547AX32AY8AZ752CH134
RA90RV548AX32AY8AZ752CH134

I can move the sensors around, but the values don't change.

One observation that might be crucial that I can't explain is that if I use only one sensor, in which case i get correct results. If I then move the call Wire.begin(); from the constructor to the main sketch in front of the call to the constructor, my measures are gone. So, are there some caveats with using separate compilation units or the Wire library in special that I am not aware of?

I just moved all the i2c related code from the cpp's into the main pde file, producing monolithic spaghetti code. And guess what, now both sensors work at the same time. I can hardly believe that's the way to do it.