1. ホーム
  2. c++

[解決済み] C++の識別子が未定義である

2022-03-12 06:17:25

質問

C++の初心者ですが、なぜこのエラーが出るのか理解できません。似たような5つのステートメントのうち、3つはエラーをマークしますが、他の2つは大丈夫です。エラーはmain関数にあります。

    #include <iostream>
using namespace std;

// Function declaration
void getGallons(int wall);
void getHours(int gallons);
void getCostpaint(int gallons, int pricePaint);
void getLaborcharges(int hours);
void getTotalcost(int costPaint, int laborCharges);

// Function definition
void getGallons(int wall)
{
    int gallons;

    gallons = wall / 112;

    cout << "Number of gallons of paint required: " << gallons << endl;


}

// Function definition
void getHours(int gallons)
{
    int hours;

    hours = gallons * 8;

    cout << "Hours of labor required: " << hours << endl;


}

// Function definition
void getCostpaint(int gallons, int pricePaint)
{
    int costPaint;

    costPaint = gallons * pricePaint;

    cout << "The cost of paint: " << costPaint << endl;
}

// Function definition
void getLaborcharges(int hours)
{
    int laborCharges;

    laborCharges = hours * 35;

    cout << "The labor charge: " << laborCharges << endl;
}

// Funtion definition
void getTotalcost(int costPaint, int laborCharges)
{
    int totalCost;

    totalCost = costPaint + laborCharges;

    cout << "The total cost of the job: " << totalCost << endl;
}

// The main method
int main()
{
    int wall;
    int pricePaint;

    cout << "Enter square feet of wall: ";
    cin >> wall;

    cout << "Enter price of paint per gallon: ";
    cin >> pricePaint;

    getGallons(wall);

    getHours(gallons); // error here

    getCostpaint(gallons, pricePaint);

    getLaborcharges(hours); // error here

    getTotalcost(costPaint, laborCharges); //error here

    return 0;

}

このレッスンでは、関数の使用とコード内のパラメータの受け渡しに焦点を当てました。グローバル変数を使ってはいけないんだ。もし、もっといい方法があったら教えてください。

どうやって解決するの?

3行に減らす(他のエラーも同様です)。

int wall;    
getGallons(wall);
getHours(gallons); // error here

一方 wall が定義されています。 gallons はありません。また、どこで gallons ということです。結果は別の関数の奥深くに隠されています。そこからどうやって取り出すんだ?

さて、戻り値が必要ですね。

  int getGallons(int wall)
//^^^ !
{
     int gallons = wall / 112;
     // ...
     return gallons; // !
}

そうすると、こんな風に関数を使うことができます。

int gallons = getGallons(wall);
// now gallons is defined and you can use it:
getHours(gallons);

他の関数や変数についても同様です。

通常は ない ロジック(計算)とアウトプットを混在させるのは良いアイデアだと思います。そこで、コンソールへの書き込みを main 関数を使用します。

int getGallons(int wall) { return wall / 112; }
int getHours(int gallons) { return gallons * 8; }

int wall;
std::cin >> wall;
int gallons = getGallons(int wall);
std::cout << ...;
int hours = getHours(gallons);
std::cout << ...;

お気づきですか?今、すべての入出力は同じレベルにあるのです...。

余談:関数を定義する前に使用しないのであれば、関数を定義する前に宣言する必要はありません。

//void f(); // CAN be ommitted
void f() { };
void g() { f(); }

反例です。

void f();
void g() { f(); } // now using f before it is defined, thus you NEED do declare it
void f() { };

それでも宣言を残すかどうかは、むしろスタイルの問題です(ただし、異なるコンパイル単位でコードを管理する場合には、ヘッダーファイルに宣言を記述することになるので重要になります - 次のレッスンですぐに遭遇することになるでしょう)。