不能取值对象--C++

Mar*_*ras 2 c++ syntax-error c++11

我在获取"p1.media"的价值方面遇到了问题.价值是媒体:6.91026e-310,必须像1000,5000,....我尝试了太多的解决方案,但任何人的工作.这是代码:

Calculos.h代码

#ifndef CALCULOS_H
#define CALCULOS_H
//includes
#define N 100
using namespace std;

class Calculos {
public:
    Calculos(double T[], int op);  
    Calculos(double T[], int op, double media);
    Calculos(); //constructor por defecto
    void run();

    int op;
    double desvtipica, media, *T;
};
#endif
Run Code Online (Sandbox Code Playgroud)

Calculos.cpp代码

//includes
#include "Calculos.h"
using namespace std;

Calculos::Calculos(double T[], int op) { 
    this->T = T;
    this->op = op;
    desvtipica = 0.0;
};

Calculos::Calculos() { 
}
Calculos::Calculos(double T[], int op, double media) {
    this->T = T;
    this->op = op;
    this->media=media;

};
void Calculos::run() {
    if(op == 1) {   //calcular media
        double suma = 0.0;
        for(int i = 0; i < N; i++) {
            suma = suma + T[i];
        }   
        media = (double)(suma/N);
    }
    else {  //op=3 calcular desviacion tipica
        desvtipica = 3.0; //partially
    }
};
Run Code Online (Sandbox Code Playgroud)

Ejercicio.cpp代码

//includes
#include "Calculos.h"
#include <iostream>
#include <cstdlib>
#include <thread>

using namespace std;

double fRand(double fMin, double fMax)
{
    double f = (double)rand() / RAND_MAX;
    return fMin + f * (fMax - fMin);
};

int main() {
    cout << "#datos: " << N << endl;
    double T[N];
    for(int i = 0 ; i < N; i++) {
        T[i] = fRand(1.0, 1000.0);
    }

    thread P[2];

    Calculos p1(T, 1);
    P[0] = thread(&Calculos::run, p1);
    P[0].join();
    double m = p1.media;   // Here is the problem. p1.media return bad values
    cout << "media: " << m << endl;
    Calculos p3(T, 3, m);
    P[1] = thread(&Calculos::run, p3);
    P[1].join();

    cout << "Fin\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

ser*_*gej 5

将参数传递给thread构造函数的方式存在问题.

更改:

   P[0] = thread(&Calculos::run, p1); // creates a copy of p1
Run Code Online (Sandbox Code Playgroud)

至:

   P[0] = thread(&Calculos::run, std::ref(p1)); // pass p1 by reference
Run Code Online (Sandbox Code Playgroud)

现在的输出是:

#datos: 100
media: 547.278
Fin
Run Code Online (Sandbox Code Playgroud)

笔记

线程函数的参数按值移动或复制.如果需要将引用参数传递给线程函数,则必须将其包装(例如,使用std::refstd::cref).

来源:http://en.cppreference.com/w/cpp/thread/thread/thread (强调我的)


在你的代码中,p1.media0因为你没有对它做任何事情.您使用过的临时副本p1.