displayChoices
クラスMachineManager
のオブジェクトを介して、クラスのメンバーであるメソッドを呼び出そうとしています。しかし、私はすでに構造体の配列を初期化するコンストラクターを持っています。クラスコンパイラのオブジェクトを作成するときに私がどのように理解したかは、クラスのデフォルトコンストラクタを暗黙的に作成します。
質問:メソッドを呼び出す方法はdisplayChoices
?
#include "MachineManager.h"
using namespace std;
int main()
{
MachineManager mjp;
mjp.displayChoices();
return 0;
}
struct BrewInfo {
string* DrinkName;
double* Cost;
int* Number;
};
class MachineManager {
static const int Num_Drinks = 3; /// why it works only with static?!!!
BrewInfo* BrewArr[Num_Drinks];
public:
MachineManager()
{
*BrewArr[0]->Cost = 1.25;
*BrewArr[0]->Number = 20;
*BrewArr[1]->DrinkName = "pepsi";
*BrewArr[1]->Cost = 1.15;
*BrewArr[1]->Number = 17;
*BrewArr[2]->DrinkName = "Aloe";
*BrewArr[2]->Cost = 2.00;
*BrewArr[2]->Number = 15;
};
int displayChoices();
}
int MachineManager::displayChoices() // (which displays a menu of drink names and prices)
{
cout << 1;
int choice;
cout << "|1." << *BrewArr[0]->DrinkName << " |2." << *BrewArr[1]->DrinkName << " |3." << *BrewArr[2]->DrinkName << " |" << endl;
cin >> choice;
if (!choice || choice == 0) {
system("slc");
displayChoices();
}
else
return choice;
}
displayChoices
コンソールでメニューを印刷する必要があります。
ソースコードにマホのバグがあります。ポインタがどのように機能するか、まだ理解していません。
でポインタの配列を定義していBrewInfo* BrewArr[Num_Drinks];
ます。
ただし、これらのポインタは初期化されていません。彼らはどこかを指しています。次に、それらのポインタを逆参照し(どこかを指している)、メモリ内のどこかに値を割り当てます。
これは大きなバグです。
C-Sytle配列の配列次元は、コンパイル時定数でなければなりません。
書けない
int x=3;
unt array[x];
これはC99コード(VLA、可変長配列と呼ばれます)ですが、C ++ではありません。
あなたの問題の解決策:
のようなCスタイルの配列は絶対に使用しないでくださいint array[5]
。std::vector
代わりにのようなSTLコンテナを使用してください。
ポインタは使用しないでください。
これがあなたの大きな問題です。で配列を定義しますBrewInfo BrewArr[Num_Drinks];
。からポインタも削除してください
struct BrewInfo {
string* DrinkName;
double* Cost;
int* Number;
};
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加