Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++で「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」エラーが出た時の対処

投稿日:2021年9月14日 更新日:

 

<目次>

(1) C++で「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」エラーが出た時の対処
 (1-1) エラーメッセージ
 (1-2) 原因
 (1-3) 対処

(1) C++で「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」エラーが出た時の対処

(1-1) エラーメッセージ

(エラーメッセージ)
E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
 
(図111)
 

(1-2) 原因

「staticでない」メソッドを「クラス名::関数名()」のような形で呼び出すとこのエラーになります。

●staticとは?

変数や関数が「static」キーワード付きで定義されている場合、プログラムの実行中はメモリがずっと割り当てられ、それをずっと持ち回ります。なので、変数や関数が複数回呼ばれる場合等に値を引き継いで更新していくような場面で便利です。加えて、文法的な特徴としては初期化せずとも使用出来る点が挙げられます。
 
簡単な例を見てみたいと思います。まずはstaticでないメソッドです(通常のメソッド)。
 

●staticでないメソッド

以下のFruitクラスでは「calcPrice」は普通のvoid型のメソッドとして定義されています。

//# 親クラス
class Fruit {

  //# 親クラス内のメソッド
  public:
    //# ▲修正前
    void calcPrice(int amount) {
      cout << "フルーツの値段:" << amount * 100 << endl;
    }
};
 
これを次のように呼び出そうとすると、Fruitクラスのオブジェクトを作っていないため、エラーになります。
 
Fruit::calcPrice(5);
 
なので、staticでないメソッドを呼び出す場合は、次のようにオブジェクトを生成してメソッドを呼びます。
 
//# オブジェクトを生成
Fruit fr;
//# メソッドを呼び出し
fr.calcPrice(5);
 
次にstaticで宣言したメソッドを見てみます。

●staticなメソッド

以下のFruitクラスでは「calcPrice」はstaticなメソッドとして定義されています。
 
//# 親クラス
class Fruit {

  //# 親クラス内のメソッド
  public:
    //# ●修正後
    static void calcPrice(int amount) {
      cout << "フルーツの値段:" << amount * 100 << endl;
    }
};
 
staticなので、オブジェクトを作らずに次のように呼び出せます。「::」はスコープ解決演算子と呼ばれ、メソッドが所属するクラスを明示的に表現しています。
 
Fruit::calcPrice(5);
 

(1-3) 対処

以上を踏まえると、呼び出すメソッドに「static」を付ける事によって、エラーが解消すると思います。
 
まずは修正前のプログラムです。「▲修正前」が修正箇所ですが、staticが付いていないのでエラーになります。
(修正前)
#include <iostream>
#include <string>
using namespace std;

//# 親クラス
class Fruit {

	//# 親クラス内のメソッド
	public:
		//# ▲修正前
		void calcPrice(int amount) {
			cout << "フルーツの値段:" << amount * 100 << endl;
		}
};

//# 親クラスを継承したクラス
class Apple : public Fruit {

	//# 親クラスを継承したクラス内のメソッド
	public:
		//# ▲修正前
		void calcPrice(int amount) {
			cout << "リンゴの値段:" << amount * 200 << endl;
		}
};

int main() {

	Fruit::calcPrice(5);
	Apple::calcPrice(5);
	return 0;
}
 
修正後のプログラムです。「●修正後」の下の部分で、メソッドをstaticにしているのでエラーが解消しています⇒(図131)
 
(修正後)
#include 
#include 
using namespace std;

//# 親クラス
class Fruit {

	//# 親クラス内のメソッド
	public:
		//# ●修正後
		static void calcPrice(int amount) {
			cout << "フルーツの値段:" << amount * 100 << endl;
		}
};

//# 親クラスを継承したクラス
class Apple : public Fruit {

	//# 親クラスを継承したクラス内のメソッド
	public:
	  //# ●修正後
    static void calcPrice(int amount) {
      cout << "リンゴの値段:" << amount * 200 << endl;
    }
};

int main() {

  Fruit::calcPrice(5);
  Apple::calcPrice(5);
  return 0;
}
 
(図131)
 

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

C++のfork関数の構文や使い方について

  <目次> (1) C++のfork関数の構文や使い方について  (1-1) fork()関数とは?概要や目的  (1-2) fork()関数の構文  (1-3) fork()関数のサンプ …

C++の「->」(アロー演算子)とは?意味や使い方をご紹介

  <目次> (1) C++の「->」(アロー演算子)とは?意味や使い方をご紹介  (1-1) C++の「->」(アロー演算子=arrow operator)とは?  (1-2) …

C++の共用体とは?構造体との違いや使用方法について

  <目次> (1) C++の共用体とは?構造体との違いや使用方法について  (1-1) 共用体とは?構造体との違いは?  (1-2) 共用体の定義方法、変数定義方法、初期化方法  (1-3 …

パイプ通信とは?概要やサンプルプログラムをご紹介

  <目次> (1) パイプ通信とは?概要やサンプルプログラムをご紹介  (1-1) パイプ通信の概要  (1-2) パイプ通信の構文  (1-3) パイプ通信のサンプルプログラム①(単一プ …

Base64とは?概要やアルゴリズムについてご紹介

  <目次> (1) Base64とは?概要やアルゴリズムについてご紹介  (1-1) Base64とは?  (1-2) Base64の仕組み  (1-3) Base64の実装 (1) Ba …

  • English (United States)
  • 日本語
Top