わかりました、私は自分の問題を本当にばかげているように見えるものに減らしましたが、これがなぜなのか理解できません:
#include <iostream>
class ABC{
public:
void Print() { std::cout<<"ABC_TEST!\n"; }
};
int main(){
Print();
return 0;
}
私に与えます:エラー:識別子「印刷」は未定義です よろしくお願いします!
次のようになります。
#include <iostream>
class ABC{
public:
void Print() { std::cout<<"ABC_TEST!\n"; }
};
int main(){
ABC abc;
abc.Print();
return 0;
}
ABC
インスタンスメソッド(または静的ではないメンバー関数)を呼び出す前に、型のオブジェクトを作成する必要があります
または、Print()
静的関数にすることができ、::
演算子で呼び出すことができます。
class ABC {
public:
static void Print() { std::cout << "ABC_TEST\n"; }
};
int main()
{
ABC::Print();
return 0;
}
何よりPrint()
も、グローバル関数にすることもできます。
void Print()
{
std::cout << "ABC_TEST\n" ;
}
int main()
{
Print();
return 0;
}
Print()
は のメンバ関数でABC
あるため、 のインスタンスでのみ呼び出すことができますABC
:
ABC abc;
abc.Print();
まったく関係のない注意として、C++ では値付きの return0
が暗示されているため、 と記述する必要はありませんreturn 0
。
Print()
は ABC クラスのメンバー関数です。それを呼び出すオブジェクトが必要です。
int main()
{
ABC abc; // This creates an instance of ABC
abc.Print();
// ^^^^
// This invokes member function `Print()` on the object abc.
return 0;
}
のアドレスはabc
暗黙の最初のパラメーターとして function に渡されますPrint()
。そのパラメーターはポインターPrint()
として内部 (より一般的には、呼び出されたメンバー関数の内部)にアクセスできます。this
Print()
非メンバーで自由な関数であるかのように呼び出してみると、暗黙的なthis
ポインターは渡されず、コンパイラーがそれについて文句を言うのは理にかなっています。
あなたがしたように呼び出すことができるようにしたい場合Print()
は、それを非メンバー関数にする必要があります。
void Print() { std::cout<<"ABC_TEST!\n"; }
int main()
{
Print(); // This is fine now!
}