1. ホーム
  2. c++

[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー

2022-01-23 21:58:35

質問

c++入門の授業で、様々な統計を計算するプログラムを作成するプロジェクトに取り組んでいます。計算方法は決まっているのですが、教授から std::istream を使用して、ファイルから入力を収集します。このプログラムは、End of Fileマーカーに達するまでファイルから情報を収集し続けることになります。私は、その方法について非常に不慣れです。 std::istream が動作し、コンパイルしようとするとこのエラーに何度も遭遇します。

main.cpp:5:10: error: call to non-static member functions without an オブジェクト引数 stats::getInput(std::cin);

以下は、私のstats.cppファイルです。

#include "stats.h"
#include <vector>
#include <cstdlib>
#include <iostream>

stats::stats(){
}

std::vector <double> stats::getInput(std::istream& input_stream){

  std::vector <double> stream;
  double x;

  while(input_stream){

    input_stream >> x;
    // std::cout << "your list of numbers is: " << x << std::endl;

    if(input_stream){
      stream.push_back(x);
    }

  }

  return stream;
}

以下は私のヘッダーファイルです。

#ifndef _STATS_
#define _STATS_
#include <vector>
#include <cstdlib>

class stats{

 public:
  stats();
  std::vector <double> getInput(std::istream& input_stream);

 private:



};

#endif

そして、これが私のmain.cppファイルです。

#include "stats.h"
#include <iostream>

int main(){
  stats::getInput(std::cin);
}

私が言ったように、私はc++の初心者なので、おそらく答えはかなり簡単ですが、c++はPythonと大きく異なります。私は同様の質問を見たことがありますが、どれもそれを理解するのに役立ちませんでした。

ありがとうございます

解決方法は?

コンパイラからのエラーメッセージは非常にわかりやすいです。

getInput は非 static クラスのメンバ関数です。

そのメンバー関数を使用するには、そのクラスのオブジェクトが必要です。

の代わりに

stats::getInput(std::cin);

使用

stats obj;
obj.getInput(std::cin);


もう一つの解決策

このクラスはメンバ変数を持たないので、このクラスで使用するために getInput を追加しました。 static のメンバ関数です。

class stats {

   public:
      stats();
      static std::vector <double> getInput(std::istream& input_stream);

   private:
};

その場合、使用することができます。

stats::getInput(std::cin);


また、データを読み込むループは、次のように簡略化することができます。

while (input_stream >> x){
  stream.push_back(x);
}