7

次のコードは、私のC++クラスのスライドの一部です。IntelliSenceからエラーが発生しましたが、その理由はわかりません。コンストラクタとデストラクタが気に入らない理由がわかりません。誰か助けてもらえますか?

class Vehicle {
     friend void guest();
 private:
     string make;
     string model;
     int year;
 public:
     void Vehicle();
     void Vehicle(string, string, int);
     void ~Vehicle();
     string getMake();
 }

 void guest() {
     cout << make;
 }

 1) IntelliSense: member function with the same name as its class must be a constructor
 2) IntelliSense: member function with the same name as its class must be a constructor
 3) IntelliSense: return type may not be specified on a destructor
4

3 に答える 3

12

コンストラクタとデストラクタにはリターン型がありません!する必要があります:

Vehicle();
Vehicle(string, string, int);
~Vehicle();

関数に引数を渡す必要があります。

void guest(const Vehicle &v)
{
    cout << v.make; //friend allows you to access 'make' directly
}

もちろん、friendそれに応じて宣言を変更する必要があります

;そして、クラスの最後に忘れないでください

編集

動作する完全なコード:

class Vehicle {
    friend void guest(const Vehicle &v);
private:
    string make;
    string model;
    int year;
public:
    Vehicle() {}
    Vehicle(string make, string model, int year) : make(make), model(model), year(year) {}
    ~Vehicle() {}
    string getMake() const {return make;}
};

void guest(const Vehicle &v) {
    cout << v.make;
}



int main()
{
    guest(Vehicle("foo", "bar", 10));
    return 0;
}
于 2012-08-07T15:05:46.400 に答える
3

この場合、エラーメッセージを理解していれば、実際にはかなり良いものです。

void Vehicle();

「メソッド」はクラスと同じ名前であるため、Intellisenseはそれをコンストラクターにする必要があると考えています。それはそうです!コンストラクターには戻り型がないため、次のようにします。

Vehicle();

同様に:

void Vehicle(string, string, int);

また、「メソッド」の名前がクラスと同じであるため、コンストラクターのように見えます。パラメータがあるからといって、特別なものになるわけではありません。そのはず:

Vehicle(string, string, int);

デコンストラクターにもリターンタイプがないため、

void ~Vehicle();

する必要があります:

~Vehicle();
于 2012-08-07T15:08:07.067 に答える
1

コンストラクタとデストラクタにはリターン型はありません。それらを削除するだけで、コードがコンパイルされます。リターンタイプを持つ

 void Vehicle(); 

Vehicle()という名前の関数を宣言するようにコンパイラーに指示しますが、これはクラスと同じ名前であるため、コンストラクター(戻り型がない)でない限り許可されません。エラーメッセージは、この場合の問題を正確に示していました。

于 2012-08-07T15:07:10.807 に答える