类和对象实践

Posted

技术标签:

【中文标题】类和对象实践【英文标题】:Class and Object Practice 【发布时间】:2019-05-10 17:54:34 【问题描述】:

我正在练习使用基本的对象和类。我知道我在语法上弄乱了一些东西,但不知道是什么。

#include <iostream>
using namespace std;


class Pizza 
    public:

    string topping;
    int slices;


        void GetPizza(string topping, int slices) 
            topping = topping;
            slices = slices;
        
; 

int main() 
    Pizza pizza1;

    pizza1.GetPizza("cheese", 8);

    cout << pizza1.GetPizza;

    return 0;

我正在尝试打印披萨的配料和片数1。我只是不断收到编译器错误。我还想尝试只打印顶部或切片编号,但也无法真正弄清楚。

编辑:

我的代码的 v2 与错误调用不匹配:

#include <iostream>
using namespace std;


class Pizza 
    public:

    string topping;
    int slices;


        void GetPizza(string t, int s) 
            topping = t;
            slices = s;
        
; 

int main() 
    Pizza pizza1;

    pizza1.topping("cheese");

    cout << pizza1.topping("cheese");

    return 0;

【问题讨论】:

你肯定弄乱了代码格式。请看ClangFormat。 使用这个:cout topping = topping; 不会做任何有用的事情。您的局部变量会影响外部范围内的变量。 您是否应该使用GetPizza() 而不是Pizza 类的正确构造函数? 【参考方案1】:

pizza1.GetPizza 是类成员函数。你不能把它喂给 cout。

如果你想打印一些东西,打印类成员变量。像这样:

cout << pizza1.topping;
cout << pizza1.slices;

同样在GetPizza 函数中,你有以下几行:

topping = topping;
slices = slices;

编译器如何知道左侧指的是成员变量,右侧指的是函数参数(这可能是本意)?确保他们的名字不同。

void GetPizza(string t, int s) 
        topping = t;
        slices = s;
    

重新编辑 v2:

pizza1.topping 不是函数。它是string 类型的成员变量。你不能这样称呼它:

pizza1.topping("cheese");

如果你想给它赋值,正确的语法是:

pizza1.topping = "cheese";

下一行也是如此。

【讨论】:

“确保他们的名字不同” - 我 100% 同意,但有 不同的选择:您可以使用 this-&gt;topping 明确引用成员变量。但是,是的,一开始就没有阴影会更好 所以我按照您的建议更改了变量名称,并尝试打印类变量,而不是通过调用函数进行打印。现在我收到“不匹配调用...”错误。我想如果你想写这样的东西,你会怎么做?我得到了类和变量的概念,但我对需要去哪里以及为什么更加模糊 我将尝试两个粘贴到我的问题中 我没有看到任何变化。 我试图编辑帖子,但它说在同行评审之前不会显示?对不起,我是这个网站的新手。我在 πάντα ῥεῖ 的回答上留下的评论总结了我的问题。【参考方案2】:

错误在这里 cout &lt;&lt; pizza1.GetPizza; 根据您的实现,GetPizza 方法调用需要两个参数。因此,在打印时,您还需要传递这些参数,类似于您在下一行中所做的。 pizza1.GetPizza("cheese", 8);

【讨论】:

我的回答中提到了更多问题。 @πάντα ῥεῖ 我没有阅读您的答案,因为它不存在,而我自己写了答案。你必须很擅长在代码中找到整个错误,同时你必须鼓励我们,他们仍然试图在代码中找到错误。 @YatShan 我认为 πάντα ῥεῖ 意味着从答案复制内容到评论是不值得的。相反,该答案被“通过引用”合并到评论中(假装它被复制到评论中作为更详尽答案的示例)。 @JaMiT 我不明白你的评论。我没有从任何地方复制。我写了自己的答案,看着问题。 @YatShan 呃……什么?好的,我会在不使用代词的情况下再试一次。该答案已“通过引用”合并到评论中(为了理解 πάντα ῥεῖ 的初始评论,假装 πάντα ῥεῖ 的初始评论开始“还有更多问题”然后是描述这些问题的 πάντα ῥεῖ 的回答部分)。

以上是关于类和对象实践的主要内容,如果未能解决你的问题,请参考以下文章

04_类和对象

学习笔记持久类和对象持久化的应用

《深入PHP:面向对象模式与实践》

php面向对象之抽象类和接口理解

C++基础——C++面向对象之类对象与继承基础总结(类和对象概念构造函数与析构函数this指针继承)

3.1类和对象