2010-03-14 4 views
2

Хорошо, я должен предварить это о том, что я знаю, так что так мало о C++, и я надеюсь кто-то может просто помочь мне ...Супер Noob C++

У меня есть следующий код:

string GoogleMapControl::CreatePolyLine(RideItem *ride) 
{ 
    std::vector<RideFilePoint> intervalPoints; 
    ostringstream oss; 

    int cp; 
    int intervalTime = 30; // 30 seconds 
    int zone =ride->zoneRange(); 
    if(zone >= 0) 
    { 
     cp = 300; // default cp to 300 watts 
    } 
    else 
    { 
     cp = ride->zones->getCP(zone); 
    } 

    foreach(RideFilePoint* rfp, ride->ride()->dataPoints()) 
    { 
     intervalPoints.push_back(*rfp); 
     if((intervalPoints.back().secs - intervalPoints.front().secs) > intervalTime) 
     { 
      // find the avg power and color code it and create a polyline... 
      AvgPower avgPower = for_each(intervalPoints.begin(), 
             intervalPoints.end(), 
             AvgPower()); 
      // find the color 
      QColor color = GetColor(cp,avgPower); 
      // create the polyline 
      CreateSubPolyLine(intervalPoints,oss,color); 
      intervalPoints.clear(); 
      intervalPoints.push_back(*rfp); 
     } 

    } 
    return oss.str(); 
} 


void GoogleMapControl::CreateSubPolyLine(const std::vector<RideFilePoint> &points, 
             std::ostringstream &oss, 
             QColor color) 
{ 
    oss.precision(6); 
    QString colorstr = color.name(); 
    oss.setf(ios::fixed,ios::floatfield); 
    oss << "var polyline = new GPolyline(["; 

    BOOST_FOREACH(RideFilePoint rfp, points) 
    { 
     if (ceil(rfp.lat) != 180 && ceil(rfp.lon) != 180) 
     { 
      oss << "new GLatLng(" << rfp.lat << "," << rfp.lon << ")," << endl; 
     } 
    } 

    oss << "],\"" << colorstr.toStdString() << "\",4);"; 

    oss << "GEvent.addListener(polyline, 'mouseover', function() {" << endl 
    << "var tooltip_text = 'Avg watts:" << avgPower <<" <br> Avg Speed: <br> Color: "<< colorstr.toStdString() <<"';" << endl 
    << "var ss={'weight':8};" << endl 
    << "this.setStrokeStyle(ss);" << endl  
    << "this.overlay = new MapTooltip(this,tooltip_text);" << endl 
    << "map.addOverlay(this.overlay);" << endl 
     << "});" << endl 
    << "GEvent.addListener(polyline, 'mouseout', function() {" << endl 
    << "map.removeOverlay(this.overlay);" << endl 
    << "var ss={'weight':5};" << endl 
    << "this.setStrokeStyle(ss);" << endl 
    << "});" << endl; 

    oss << "map.addOverlay (polyline);" << endl; 
} 

И я пытаюсь получить avgPower из этой части:

AvgPower avgPower = for_each(intervalPoints.begin(), 
              intervalPoints.end(), 
              AvgPower()); 

первая часть в Сагу на второй части:

<< "var tooltip_text = 'Avg watts:" << avgPower <<" <br> Avg Speed: <br> Color: "<< colorstr.toStdString() <<"';" << endl 

Но, конечно, я не имею ни малейшего понятия, как это сделать ... сегодня любое чувство щедрого чувства?

Заранее спасибо

+0

+1: для претензий быть noob, но с использованием stl-алгоритмов. Вы читали книги? ;) –

ответ

2

Ну вы не заявите проблему с кодом другого, чем это не работает. Я подозрюю вас в использовании AvgPower() в for_each. Кроме того, у вас есть AvgPower как класс. почему не двойник или что-то еще? Для этого кода я бы ожидал увидеть что-то вроде этого:

PowerType addIntervals(const RideFilePoint &p1, const RideFilePoint &p2) { 
    //Add and return. 
} 
    ... 
    ... 
PowerType total = accumulate(i.begin(), i.end(), PowerType(0.0), &addIntervals); 
avg = total/i.length(); 

читать эти документы тщательно: http://www.sgi.com/tech/stl/accumulate.html

+1

+1 для 'std :: accumulate' –

+0

Первый параметр' addIntervals' должен иметь тип 'PowerType', а не' RideFilePoint'. –

1

Похоже, вы спрашиваете, как получить доступ к локальной переменной avgPower в другой функции (извините если я не понимаю). Это меньше о C++, а конкретно о функциональном или объектно-ориентированном дизайне. Есть много разных способов сделать это, но вот разумные, о которых я могу думать, в порядке моих предпочтений.

  1. Создайте avgPower (и цвет) в пределах CreateSubPolyLine. В любом случае, по-видимому, в CreatePolyLine не существует какой-либо причины. Внесите отдельный вызов, если есть другие потребители. Функция подписи изменится на

    ничтожной GoogleMapControl :: CreateSubPolyLine (константный зЬй :: Вектор & точек, станд :: ostringstream & Осс)

  2. Включите его в paramemters работы функции, например, изменить подпись :

    аннулируются GoogleMapControl :: CreateSubPolyLine (Const станд :: вектор & точек, станд :: ostringstream & ОСС, Const QColor & цвет, const AvgPower & avgPower)

  3. Поместите его в переменную-член GoogleMapControl. Похоже, что это было бы плохой выбор дизайна, на мой взгляд.