有人能说出我的代码有什么问题吗?

时间:2015-09-27 05:21:50

标签: c++ inheritance

我是初学者,在这段代码中无法弄清楚我做错了什么。结果以无限循环(我认为)结束,不打印任何东西。我故意离开函数speak()非虚拟,我知道我只会打印Animal的数据。

if conditionfails{
     heightconstOfView1.constant = 0
}
else{
    heightconstOfView2.constant = 0
}

有人可以帮忙吗?我可能在这里犯了一个非常愚蠢的错误。请告诉我有什么问题?

3 个答案:

答案 0 :(得分:2)

在你的代码中,你犯了两个重大错误。

  1. 在Animal,Dog和Cat课程中,您有三种说话功能。但是你将它们声明为字符串类型函数。但唯一输出一些文字,但不返回任何东西。你必须将它们改为无效。或者您可以返回文本而不是输出文本。

  2. 在main函数中,您已编写cout << ptr->speak() << endl;来输出文本。但是你的说话功能不会返回任何字符串输出。它输出文本本身。所以,你必须写ptr->speak();来输出动物的言语。你不需要 cout

  3. 我在下面给出了两个示例代码。你可以选择其中任何一个。两者都很好。

    示例#1:使用void(主要没有cout)

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Animal
    {
    protected:
        string m_name;
        string m_speak;
    
    public:
        Animal(string name, string speak = "???"): m_name(name), m_speak(speak){}
        void speak(){cout << m_name << " speaks " << m_speak;}
    };
    
    class Dog: public Animal
    {
    private:
        string m_dspeak;
    
    public:
        Dog(string name, string speak = "Woof!"): Animal(name), m_dspeak(speak){}
        void speak(){cout << m_name << " speaks " << m_dspeak;}
    };
    
    class Cat: public Animal
    {
    private:
        string m_cspeak;
    
    public:
    
        Cat(string name, string speak = "Meow!"): Animal(name), m_cspeak(speak){}
        void speak(){cout << m_name << " speaks " << m_cspeak;}
    };
    
    int main()
    {
        Cat Fred("Fred");
        Dog Stuffy("Stuffy");
    
        Animal *ptr = &Fred;
        ptr->speak();
    
        Animal *ptr2 = &Stuffy;
        ptr2->speak();
    }
    

    示例#2:在函数中使用return,在main

    中使用cout
    #include <iostream>
    #include <string>
    using namespace std;
    
    class Animal
    {
    protected:
        string m_name;
        string m_speak;
    
    public:
        Animal(string name, string speak = "???"): m_name(name), m_speak(speak){}
        string speak(){return m_name + " speaks " + m_speak;}
    
    };
    
    class Dog: public Animal
    {
    private:
        string m_dspeak;
    
    public:
        Dog(string name, string speak = "Woof!"): Animal(name), m_dspeak(speak){}
        string speak(){ return m_name + " " + m_speak;}
    };
    
    class Cat: public Animal
    {
    private:
        string m_cspeak;
    
    public:
    
        Cat(string name, string speak = "Meow!"): Animal(name), m_cspeak(speak){}
        string speak(){ return m_name + " speaks " + m_cspeak;}
    };
    
    int main()
    {
        Cat Fred("Fred");
        Dog Stuffy("Stuffy");
    
        Animal *ptr = &Fred;
        cout << ptr->speak() << endl;
    
        Animal *ptr2 = &Stuffy;
        cout << ptr2->speak() << endl;
    }
    

答案 1 :(得分:1)

speak()的两个实现更改为:

string speak(){ return m_name + " speaks " + m_speak; }

目前,您的speak方法没有返回语句,因此返回值未定义,这可能会导致奇怪的问题。

答案 2 :(得分:-3)

对不起,我误解了你的问题。我编辑了答案。

你不需要在这个功能中小丑。你会在主要的那样做。

namespace TestFastJson
{
    internal class Program
    {
            private static void Main()
            {
                    var sale = new Sale
                    {
                        SaleItems = new List<SaleItem>
                        {
                            new SaleItem(),
                            new SaleItem()
                        }
                    };

                    string jsonText = fastJSON.JSON.ToJSON(sale);

                    var newobj = fastJSON.JSON.ToObject<Sale>(jsonText);

                    Console.WriteLine(newobj.SaleItems.Count);
            }
    }

    public class Sale
    {
            public DateTime Date { get; set; }
            public List<SaleItem> SaleItems { get; set; }
            public int Total { get; set; }
    }

    public class SaleItem
    {
            public string ProductId { get; set; }
            public int Amount { get; set; }
            public string Quality { get; set; }
    }
}