LINUX.ORG.RU

Как использовать этот класс?

 , ,


0

1

Здравствуйте, есть tempcore.h и tempcore.cpp, подключаю tempcore.h в нужный файл и пытаюсь использовать, но появляется ошибка undefined reference to 'tempCore::getCpuTemp()' (он так про все методы этого класса) пробовал использовать так:

tempCore *tc;
tc = new tempCore;
tc->getCpuTemp();
tempCore tc;
tc.getCpuTemp();

Через двоеточие должно работать, тк другой класс сделан примено так же, но мне надо создать именно экземпляр класса, чтобы один раз при создании экземпляра он собрал всю необходимую информацию и сохранил в QMap. tempcore.h:

#include <QString>
#include <QMap>
#ifndef TEMPCORE_H
#define TEMPCORE_H


class tempCore
{
private:
    QMap<QString, QString> data;
    void writer(QString &str);
public:
    tempCore();
    QString getCpuTemp();
    QString getGpuTemp();
};

#endif // TEMPCORE_H

tempcore.cpp:

#include "tempcore.h"
#include <QStringListModel>
#include <QFile>
#include <QMap>
#include <QtDebug>
#include <iostream>
#include <QDir>
#include <QIODevice>
#include <string>

QMap<QString, QString> data;

void writer(const QString &str) {
    QFile nameFile(str+"/name");
    if (nameFile.open(QIODevice::ReadOnly)) {
        QTextStream ts(&nameFile);
        const QString &nameContent = ts.readLine();
        if (nameContent == "coretemp") {
            data["cpu"] = str;
        }
        if (nameContent == "amdgpu") {
            data["gpu"] = str;
        }
    }

}

tempCore::tempCore()
{   
    int i = 0;
    do {
        QString full_path = "/sys/class/hwmon/hwmon"+QString::number(i);
        writer(full_path);
        i++;
    } while (QDir("/sys/class/hwmon/hwmon"+QString::number(i)).exists());


}





QString getCpuTemp() {
    QFile dataFile(data["cpu"]+"/temp1_input");
    if (dataFile.open(QIODevice::ReadOnly)) {
        QTextStream ts(&dataFile);
        return QString::number(ts.readLine().toInt()/1000);
    } else
        return "No data";
}

QString getGpuTemp() {
    QFile dataFile(data["gpu"]+"/temp1_input");
    if (dataFile.open(QIODevice::ReadOnly)) {
        QTextStream ts(&dataFile);
        return QString::number(ts.readLine().toInt()/1000);
    } else
        return "No data";
}


-QString getCpuTemp() {
+QString tempCore::getCpuTemp() {

Пиши всё в заголовках, будет проще.

class qwe {
  int get() {
    ...
  }
};

Или язык выучи, кресты не та вещь, которую можно использовать без подготовки.

mashmed135
()

У тебя методы класса не определены, написано же. Ответь:

  • почему приватный член QMap<QString, QString> data у тебя дублируется в *.cpp-файле?
  • зачем ты создаёшь функции GetCpuTemp() и GetGpuTemp() вне класса? Конструктор класса делать научился, а методы — нет?
XMs ★★★★★
()
Ответ на: комментарий от mashmed135

Спасибо.

Мне кажется, реализовывать методы в .cpp более правильней

pthon
() автор топика
Ответ на: комментарий от pthon

Учи C++. Hint: ты можешь использовать приватные члены класса. Внутри методов класса. Если наглядно:

class Foo
  {
	public:
		void foobar();
		int bar;
  };

int bar;

void foobar()
  { 
	// Вот так ты обращаешься к глобальной переменной
	bar = 5;
  }

void Foo::foobar()
  {
	// А вот так — к члену класса
	bar = 3;
  }

#include <iostream>

#include <cstdlib>

using namespace std;



int main()
  {
	Foo f;
	f.foobar();
	foobar();

	cout << "Foo::bar = " << f.bar << endl;
	cout << "     bar = " <<   bar << endl;
	return EXIT_SUCCESS;
  }

Foo::bar = 3
     bar = 5
XMs ★★★★★
()
11 июня 2021 г.

надо слинковать с тем самым объектником, который получился при компиляции tempcore.cpp

safocl ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.