【问题标题】:How to get base object's data in a new derived object?如何在新的派生对象中获取基础对象的数据?
【发布时间】:2020-10-11 09:29:44
【问题描述】:

(OOP 初学者。) 我有一个 person 类,它存储人的姓名。在派生类实例printer 中,我需要该名称,以便可以使用它执行进一步的任务。

#include <iostream>
#include <string>
class Person{
  public:
  std::string name;
};

class Printer: public Person{
  public:
  void print(){
      printf("%s", this->name.c_str());  
  }
};
int main() {
    Person one;
    one.name = "john";
    Printer printer;
    printer.print();
    return 0;
}

我没有做什么让printer 看到one 中的数据?我会有几个类似printer 的对象,所以这里的目标是只存储一次“john”。

【问题讨论】:

  • 考虑在Printer 中存储对Person 的引用而不是继承。 Printer 不是 Person 的类型。
  • @TedLyngmo 介意添加答案吗?更新问题后,您的回答似乎对我有所帮助。 stackoverflow.com/questions/5398540/…brado86 的这个回答没有详细说明。
  • 您可以查看此答案中的 CSVStudent 类,该类存储对要打印的对象的引用,并且具有免费的 std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const CSVStudent/); 函数来进行打印。如果您将name设为私有,则需要将其设为friend

标签: c++ class oop derived-class


【解决方案1】:

您已创建成员变量public,但这不是OOP 的正确方法,正确的方法是将它们置于私有访问说明符下并使用setter 和getter。

现在说说你的错误:

  1. 您使用void 来表示main,但对于c++,您只能使用int

  2. 您使用std::string 作为printf 的参数,但它不能接受。 (我通过了std::stringc_string 来纠正这个问题)。

  3. 您使用父类中的一个对象并为其命名,然后使用驱动对象中的另一个对象来打印第一个对象的名称。 (我只用了一个)

#include <iostream>
#include <string>

class Person{
public:
    std::string name;
};

class Printer: public Person{
public:
    void print(){
        printf("%s",this-> name.c_str());
    }
};
int main() {
    Printer printer;
    printer.name = "name";
    printer.print();
}

在你的 cmets 之后,我更新了 Printer 类来做你的意图

#include <iostream>
#include <string>
class Person{
public:
    std::string name;
};

class Printer{
public:
    void print(const Person& person ){
        printf("%s", person.name.c_str());
    }
};
int main() {
    Person one;
    one.name = "name";
    Printer printer;
    printer.print(one);
}

【讨论】:

  • 感谢您指出错误。jdoodle 没有抱怨任何事情。 \\ 我希望人名只存储一次,并从几个派生类中访问它。
  • 那么你可以创建一个与那个人同名的类,使其成员变量名不变,然后从它继承。或者使该人成为类打印机中的成员变量,而无需任何继承。
  • “使该人成为类打印机中的成员 var”:呃,不。 Printer 应该只打印。 Person 应该只存储。
猜你喜欢
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多