首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅使用getName在主函数中设置字符串名称

仅使用getName在主函数中设置字符串名称
EN

Stack Overflow用户
提问于 2017-04-17 00:34:54
回答 2查看 122关注 0票数 1

我正在使用演示多态的子类进行作业。这个程序要求为每个新对象指定一个名称。我只应该有字符串getName(){返回名称;}(这位于基类中)。每个类class(string){}.中都有一个构造函数。在主函数中,我希望设置每个对象的名称。任何建议都是非常感谢的,我应该这样做!

H档案:

代码语言:javascript
复制
#ifndef DUCK_H
#define DUCK_H
#include <string>
using namespace std;

class Duck
{
private:
    string name;
public:
    Duck(){}
    Duck(string){}
    string getName() { return name; };
    virtual string quack() {return "Which"; }
    virtual string fly() { return "How?"; }
};
class RubberDuck : public Duck
{
public:
    RubberDuck(){}
    RubberDuck(string) {}
    string quack() { return "Squeak"; }
    string fly() { return "Fly with bounce"; }
};
class MallardDuck : public Duck
{
public:
    MallardDuck(){}
    MallardDuck(string) {}
    string quack() { return "Quack"; }
    string fly() { return "Fly with wings"; }
};
class RocketDuck : public Duck
{
public:
    RocketDuck(){}
    RocketDuck(string) {}
    string quack() { return "Zoom"; }
    string fly() { return "Fly with rockets"; }
};
#endif // !1

cpp文件:

代码语言:javascript
复制
#include <iostream>
#include "Duck.h"
using namespace std;

//void display(Duck *d);

int main()
{
    Duck d1;
    MallardDuck md;
    RubberDuck rbd;
    RocketDuck rd;

    //for main duck
    //Duck duck("Donald");
    //cout << duck.getName();
    cout << d1.quack() <<"\n";
    cout << d1.fly() <<"\n";
    cout << "\n";
    //for rubber duck
    RubberDuck rbdname("Rubby");
    cout << rbd.quack() << "\n";
    cout << rbd.fly() << "\n";
    cout << "\n";
    //for mallard duck
    MallardDuck mdname("Mally");
    cout << md.quack() << "\n";
    cout << md.fly() << "\n";
    cout << "\n";
    // for rocket duck
    RocketDuck rdname("Rocky");
    cout << rd.quack() << "\n";
    cout << rd.fly() << "\n";
    cout << "\n";
    //polymorphism
    Duck *d2 = new MallardDuck();
    cout << d2->getName() << "\n";
    cout << d2->quack() << "\n";
    cout << d2->fly() << "\n";
    cout << "\n";

    return 0;
 }
/*void display(Duck d)
{
    cout << d.quack();
}
*/
EN

回答 2

Stack Overflow用户

发布于 2017-04-17 01:10:28

您是在问如何调用您定义的构造函数吗?你会这样做的

代码语言:javascript
复制
Duck duck("Drake Mallard");
票数 0
EN

Stack Overflow用户

发布于 2017-04-17 02:27:44

使用此代码:

代码语言:javascript
复制
    Duck(){}
    Duck(string){}

无论是调用默认构造函数还是调用name构造函数,都不初始化成员string

您的必须使用输入参数,就像我向您展示的那样:

代码语言:javascript
复制
Duck(string const & input_name) : name(input_name) {}
                                  ^^^^^^^^^^^^^^^^

当您这样做时,带下划线的部分将成员name初始化为值"Drake Mallard"

代码语言:javascript
复制
Duck duck("Drake Mallard");

然后,您将让duck.getName()返回"Drake Mallard"

您必须在派生类中应用相同的原则,才能调用这个完全相同的基本构造函数:

代码语言:javascript
复制
class RubberDuck : public Duck
{
 public:
    RubberDuck() : Duck("RubberDuck") {}
    RubberDuck(string const & input_name) : Duck(input_name) {}

然后

代码语言:javascript
复制
RubberDuck rubber;          // name = "RubberDuck"
RubberDuck rubber("Ruber"); // name = "Rubber"

但也包括:

代码语言:javascript
复制
RubberDuck * rubber = new RubberDuck();        // name = "RubberDuck"
RubberDuck * rubber = new RubberDuck("Ruber"); // name = "Rubber"

如果您问,我的评论中的前面部分Duck::考虑了在class Duck { ... };之外实现构造函数的位置。

您应该避免使用using namespace,特别是在标头中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43443608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档