1

わかりました、私は自分の問題を本当にばかげているように見えるものに減らしましたが、これがなぜなのか理解できません:

#include <iostream>
class ABC{
public:
    void Print() { std::cout<<"ABC_TEST!\n"; }
};

int main(){
    Print();
    return 0;
}

私に与えます:エラー:識別子「印刷」は未定義です よろしくお願いします!

4

3 に答える 3

3

次のようになります。

#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;
}
于 2013-03-10T21:42:51.247 に答える
1

Print()は のメンバ関数でABCあるため、 のインスタンスでのみ呼び出すことができますABC:

ABC abc;
abc.Print();

まったく関係のない注意として、C++ では値付きの return0が暗示されているため、 と記述する必要はありませんreturn 0

于 2013-03-10T21:42:10.937 に答える
1

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!
}
于 2013-03-10T21:42:18.803 に答える