エラー: C++ でオブジェクトなしでメンバー関数を呼び出すことはできません

Naila Saad Siddiqui 2023年10月12日
  1. C++ の error: cannot call member function without object を修正
  2. クラスのインスタンスを使用してメンバー関数にアクセスする
  3. 静的メンバー関数を使用する
エラー: C++ でオブジェクトなしでメンバー関数を呼び出すことはできません

この記事では、C++ を使用してオブジェクト指向プログラミングを行っているときに、よく発生するエラー cannot call member function without object について説明します。 さらに、エラーの潜在的な修正も提供します。

C++ の error: cannot call member function without object を修正

C++ でよくあるエラーは、オブジェクト指向プログラミングで作業しているときに、オブジェクトなしでメンバー関数を呼び出すことはできませんというエラーが頻繁に発生します。 このエラーの原因は、クラスをインスタンス化せずにクラスのメンバー メソッドを呼び出していることです。

すべてのクラスには、一連のデータ メンバーといくつかのメンバー関数があります。 メンバーメソッドまたは関数にアクセスするクラスオブジェクトを作成し、このオブジェクトを使用してメソッドを呼び出し/アクセスする必要があります。

次のコードを検討してください。

#include <iostream>
using namespace std;
class Rectangle {
 private:
  int length = 5;
  int width = 8;

 public:
  double getArea() { return length * width; }
};
int main() { cout << "Area: " << Rectangle::getArea() << endl; }

このコードは、次の出力を生成します。

オブジェクトなしでメンバー関数を呼び出すことはできません

上記のコード スニペットの 16 行目では、クラス名を使用して getArea() メソッドを呼び出そうとしています。 クラスのすべての非静的メンバーは、クラスのオブジェクトを介してのみアクセスする必要があります。 したがって、行はエラーを生成します。

クラスのインスタンスを使用してメンバー関数にアクセスする

このエラーは、次のようなクラスのオブジェクトで関数/メソッドを呼び出すことで解決できます。

int main() {
  Rectangle r;
  cout << "Area: " << r.getArea() << endl;
}

これにより、正しい出力が得られます。

Area: 40

静的メンバー関数を使用する

静的メンバー関数は、それらを呼び出すためにオブジェクトを必要としないクラスの関数です。 スコープ解決演算子 :: を使用してクラス名で直接呼び出すことができます。

静的メンバー関数を使用するときは、特定の制限に留意する必要があります。 静的メンバー関数は、クラスの静的データ メンバーにのみアクセスでき、他の静的メンバー関数のみを呼び出すことができます。

cannot call member function without object エラーの解決策について説明している以下の例を見てみましょう。

#include <iostream>

using namespace std;

class Rectangle {
 private:
  int length = 5;
  int width = 8;

 public:
  double getArea() { return length * width; }
  static void getShapeName() { cout << "Hello, I am a Rectangle." << endl; }
};
int main() {
  Rectangle r;
  cout << "Area: " << r.getArea() << endl;
  Rectangle::getShapeName();
}

これにより、次の出力が得られます。

Area: 40
Hello, I am a Rectangle.

関連記事 - C++ Error