-1

文字列、構造体、列挙型、および int をパラメーターとして受け入れるクラス コンストラクターがあります。これとは別に、デフォルトのコンストラクターもあります。パラメーター化されたコンストラクターを使用して作成されたオブジェクト名を使用してクラス関数を呼び出すたびに、メンバーが非クラス型であるというエラーが発生します。しかし、デフォルトのコンストラクター オブジェクト名を使用すると、エラーは発生しません。

Car obj(string bini, struct Date dini, enum Status state, int id);
obj.getBrand();  //doesn't work. getting non-class type error

Car obj1;  //constructor without parameters
obj1.getBrand(); //works fine

これがより詳細なコードです。

//main.cpp
struct Date
{
int year = 0;
int month = 0;
int day = 0;
};
enum Status{ OK, SOLD, DEFECT };
int main()
{
string bini = "";
int id = 0;
Car obj(string bini, struct Date dini, enum Status state, int id);
obj.getBrand();  //doesn't work. getting non-class type error
//  Car obj1;  //constructor without parameters
//obj1.getBrand(); //works fine
}
//Car.h
class Car
{
public:
struct TDate
{
int year;
int month;
int day;
};

enum TStatus{ OK, SOLD, DEFECT };


void getID();
void getPrice();
void getBrand();
TStatus getStatus();
TDate getManufactureDate();
void setPrice(float price);
void setStatus(TStatus state);
void sellCar();
Car();
Car(string bini, struct TDate dini, enum TStatus sini, int id);
protected:
private:
TStatus state[100];
string brand[100];
float priceEuro[100];
int carId[100], bc = 0, pc = 0, dc = 0, sc = 0;
TDate manufatureDate[100];
};
//Car.cpp
Car::Car(string bini, struct TDate dini, enum TStatus sini, int id)
{
for(int i = 0; i < 100; i++)
{
brand[i] = {bini};
manufatureDate[i].day = dini.day;
manufatureDate[i].month = dini.month;
manufatureDate[i].year = dini.year;
state[i] = sini;
carId[i] = id;
}
} 
void Car::getBrand()
{
cout << "Enter the Brand of the Car : " << endl;
cin >> brand[bc];
carId[bc] = bc;
bc++;
}

ここでやっている間違いはわかりません。助けていただければ幸いです。ありがとう

4

2 に答える 2

2
Car obj(string bini, struct Date dini, enum Status state, int id);

それが関数宣言です。渡す変数の型を省略します。

Car obj(bini, dini, state, id);
于 2013-06-18T10:35:19.543 に答える
0

最後に、間違いが何であるかを見つけました。Car.cpp の構造体と列挙型は、グローバルに定義する必要があります。そして、その変数宣言は、以下で行われるように main.cpp で行う必要があります。

//main.cpp
int main()
{
string bini = "";
int id = 0;
TDate dini;    //previously i was using separate temporary struct and enum 
dini.day = 0;  //inside main, that was not necessary. Now since the class Car's
dini.month = 0;  //struct and enum are global i can use them here to declare variables
dini.year = 0;   //for enum, i directly passed the value OK thru constructor
int id = 0;
Car obj1(bini, dini, OK, id);
obj1.getBrand();  //no error now
}
//Car.h

struct TDate    //**global definition**
{
int year;
int month;
int day;
};

enum TStatus{ OK, SOLD, DEFECT };
class Car
{
public:
void getBrand();
Car();
Car(string bini, TDate dini,TStatus sini, int id);
private:
TStatus state[100];
string brand[100];
float priceEuro[100];
int carId[100], bc = 0, pc = 0, dc = 0, sc = 0;
TDate manufatureDate[100];
};
//Car.cpp
Car::Car(string bini, TDate dini, TStatus sini, int id)
{
for(int i = 0; i < 100; i++)
{
brand[i] = {bini};
manufatureDate[i].day = dini.day;
manufatureDate[i].month = dini.month;
manufatureDate[i].year = dini.year;
state[i] = sini;
carId[i] = id;
}
} 
void Car::getBrand()
{
cout << "Enter the Brand of the Car : " << endl;
cin >> brand[bc];
carId[bc] = bc;
bc++;
}

ありがとう。

于 2013-06-18T23:24:57.183 に答える