我的代码不会因为一个奇怪的原因而编译

时间:2013-04-14 16:51:59

标签: c++

#include <iostream>
using namespace std;

class Vehicule {
public:
    void affiche() const {
        cout << "Ceci est un vehicule." << endl;
    }

protected:
    int m_prix;
};

class Voiture : public Vehicule {
public:
    void affiche() const {
        cout << "Ceci est une voiture." << endl;
    }

private:
    int m_portes;
};

class Moto : public Vehicule {
public:
    void affiche() const {
        cout << "Ceci est une moto." << endl;
    }

private:
    double m_vitesse;
};

void presenter(Vehicule v) {
    v.affiche();
}

int main() {
    Vehicule v;
    presenter(v);

    Moto m;
    presenter(m);

    system("PAUSE");

    return 0;
}

此代码无法编译。你知道为什么吗? Visual Studio说m和v并且已经使用但未初始化。但不是吗?我的意思是,我将它们初始化。

此代码无法编译。我重复。它没有编译。

我得到的错误(不是警告,这是一个错误)是:

使用未初始化的局部变量'm' 未初始化的局部变量'v'使用

3 个答案:

答案 0 :(得分:1)

C4700是警告,不是错误。你的代码编译得很好。它只是告诉您成员m_vitessem_portesm_prix未初始化。如果要初始化它们,则需要为这些类提供自己的构造函数,例如:

class Vehicule {
public:
    // This constructor initializes m_prix to 0
    Vehicule() : m_prix(0) { }

    void affiche() const {
        cout << "Ceci est un vehicule." << endl;
    }

protected:
    int m_prix;
};

答案 1 :(得分:1)

你的代码会编译,但是会收到警告。因为Vehicule提供了初始化m_prix的默认构造函数。您可以通过添加construtor来修复它。

class Vehicule {
public:
  Vehicule():m_prix(0){};
    void affiche() const {
        cout << "Ceci est un vehicule." << endl;
    }

答案 2 :(得分:0)

Visual Studio抱怨,因为您没有初始化类的数据成员(m_prixm_portes等)。方法affiche也必须是虚拟的,函数presenter必须通过引用给出其参数。

class Vehicule {
public:
    virtual void affiche() const {
        cout << "Ceci est une voiture." << endl;
    }
};

void presenter(const Vehicle& v) {
    v.affiche()
}