C++ 为什么使用默认参数?

C++ 为什么使用默认参数?,c++,C++,下面的代码为我提供了默认值,即使我尝试了几个值。我找不到逻辑错误:( 我肯定是对施工人员做了什么错事,但我不知道他们为什么不能按预期工作 class cGeoPos { private: double lang = 8.7; double breit = 52.5; public: cGeoPos(){ } cGeoPos(double lang_in, double breit_in){

下面的代码为我提供了默认值,即使我尝试了几个值。我找不到逻辑错误:(

我肯定是对施工人员做了什么错事,但我不知道他们为什么不能按预期工作

    class cGeoPos {
    private:
        double lang = 8.7;
        double breit = 52.5;
    public:
        cGeoPos(){
        }
        cGeoPos(double lang_in, double breit_in){
            lang = lang_in;
            breit = breit_in;
        }
        void setGeoPos(double lang_in, double breit_in){
            lang = lang_in;
            breit = breit_in;
        }
        void printGeoPos(){
            cout << lang << "\t" << breit << endl;
        }
    };

    class cBaum {
    private:
        string art = "-";
        double hoch = 0;
        cGeoPos posi;
    public:
        cBaum(){
            art = "-";
            hoch = 0;
            posi.setGeoPos(0, 0);
        }
        cBaum(string art_in, double hoch_in, double lang_in, double breit_in)
        {
            art = art_in;
            hoch = hoch_in;
            cGeoPos;
            posi.setGeoPos(lang_in, breit_in);
        }
        int eingabe(){
            string art_in;
            double hoch_in, lang_in, breit_in;
            cout << endl << "Bitte Baumart eingeben: ";
            cin >> art_in;
            cout << endl << "Bitte Hoehe eingeben: ";
            cin >> hoch_in;
            cout << endl << "Bitte geografische Laenge eingeben: ";
            cin >> lang_in;
            cout << endl << "Bitte geografische Breite eingeben: ";
            cin >> breit_in;
            cBaum(art_in, hoch_in, lang_in, breit_in);
            if (art_in == "-") {
                return 0;
            }
            else {
                return 1;
            }
        }


    int main()
    {
        int i = 0;

        cBaum wald[1000];
        while (i < 1000) {
            if (wald[i].eingabe() == 0) {
                return 1;
            }
            i++;
        }

        return 0;
    }
类cGeoPos{
私人:
双朗=8.7;
双倍breit=52.5;
公众:
cGeoPos(){
}
cGeoPos(双朗宁,双布莱特){
lang=lang_in;
breit=breit_in;
}
无效setGeoPos(双lang_-in,双breit_-in){
lang=lang_in;
breit=breit_in;
}
void printGeoPos(){

你的意思是分配吗

        *this = cBaum(art_in, hoch_in, lang_in, breit_in);
这里更常见的方法是

this->art = art_in; 
this->hoch = hoch_in;
等等

您还需要添加输入验证

<强>更新< /强>下面是典型的C++习语,它们同样做<强> <强> < /p>

#include <iostream>
#include <string>
#include <vector>

class cGeoPos {
    private:
        double lang;
        double breit;
    public:
        cGeoPos(double lang_in = 8.7, double breit_in = 52.5) 
            : lang(lang_in), breit(breit_in)
        { }

        friend std::ostream& operator<<(std::ostream& os, cGeoPos const& posi) {
            return os << "(" << posi.lang << ", " << posi.breit << ")";
        }

        friend std::istream& operator>>(std::istream& is, cGeoPos& posi) {
            return is >> posi.lang >> posi.breit;
        }
};

class cBaum {
    private:
        std::string art;
        double hoch;
        cGeoPos posi;
    public:
        cBaum(std::string art = "-", double hoch = 0, double lang = 0, double breit = 0)
            : art(art), hoch(hoch), posi(lang, breit)
        { }

        bool valid() const { return art != "-"; }

        friend std::ostream& operator<<(std::ostream& os, cBaum const& baum) {
            return os << "[ '" << baum.art << "', Hőhe:" << baum.hoch << ", posi:" << baum.posi << " ]";
        }

        friend std::istream& operator>>(std::istream& is, cBaum& baum) {
            if (is >> baum.art && baum.art != "-")
                return is >> baum.hoch >> baum.posi;
            else
                return is;
        }
};


int main()
{
    std::vector<cBaum> wald;

    do {
        std::cout << "Bitte (Art, Hőhe, G. Länge, G. Breite) angeben: ";

        cBaum baum;
        if (std::cin >> baum)
        {
            if (!baum.valid()) // "-" entered
                break;
            wald.push_back(baum);
        } else
        {
            if (std::cin.eof())
                break;
            std::cout << "Ungűltiger Eintrag\n";
            std::cin.clear();
            std::cin.ignore(1024, '\n');
        }
    } while (true);

    for (auto& baum : wald)
        std::cout << baum << std::endl;
}

您可能期望您的代码

cBaum(art_in, hoch_in, lang_in, breit_in);
将调用构造函数。这种方式不起作用。若要让构造函数调用另一个构造函数,必须使用专用语法,这在示例中不适用,所以请接受无法调用构造函数

请改用初始化函数:

    initialize(string art_in, double hoch_in, double lang_in, double breit_in)
    {
        art = art_in;
        hoch = hoch_in;
        cGeoPos;
        posi.setGeoPos(lang_in, breit_in);
    }
然后,使用它而不是构造函数:

initialize(art_in, hoch_in, lang_in, breit_in);
为避免代码重复,请同时更改其他构造函数以调用此函数:

    cBaum(string art_in, double hoch_in, double lang_in, double breit_in)
    {
        initialize(art_in, hoch_in, lang_in, breit_in);
    }

您没有在任何地方设置数据成员。您正在构建一个本地的、匿名的
cBaum
这行不是为wald[i]创建了一个对象cBaum,其值为?cBaum(art_in,hoch_in,lang_in,breit_in)这是一个匿名的对象,但是你想设置你的实例的值。我的意思是这样的。有一个链接给我,我可以在这里阅读这个任务吗?我建议你从这里开始:@ USER 3609625作为一个奖励,这里的典型C++习语做同样的初始化功能很少是解决方案。(它们只是破坏了不变量和封装)。另外,“要让一个构造函数调用另一个构造函数,必须使用专用语法,这在您的示例中不适用,所以请接受您不能调用构造函数。”这是相当令人困惑的。
    cBaum(string art_in, double hoch_in, double lang_in, double breit_in)
    {
        initialize(art_in, hoch_in, lang_in, breit_in);
    }