【问题标题】:C++ OOP Program question on copy constructor? Inheritance关于复制构造函数的 C++ OOP 程序问题?遗产
【发布时间】:2011-08-15 02:47:01
【问题描述】:

我还有一个关于如何在两个类之间创建复制构造函数的问题。

> person(const person& a) : name(a.getName()), address(a.getAddress()),
> schoolname(a.getSchoolname()), ssn(a.getSsn()),
> idnumber(a.getIdnumber())
>         {
> 
>         }
> 
>         person& operator =(const person& b);

那是我的构造函数尝试?我失败得很惨吗?

谢谢!

标题

#ifndef person_h
#define person_h

#include <string>
using namespace std;

    class person
    {


    public:
        person();
        person(const person& a) : name(a.getName()), address(a.getAddress()), schoolname(a.getSchoolname()), ssn(a.getSsn()), idnumber(a.getIdnumber())
        {

        }

        person& operator =(const person& b);

        person(string theName, string theAddress, string theSchoolname, string theSsn, double theIdnumber);
        string getName() const;
        void setName(string newName);
        string getSchoolname()const;
        void setSchoolname(string newSchoolname);
        string getAddress() const;
        void setAddress(string newAddress);
        string getSsn() const;
        void setSsn(string newSsn);
        double getIdnumber()const;
        void setIdnumber(double newIdnumber);
        ~person();
    protected:
        string name;
        string address;
        string schoolname;
        string ssn;
        double idnumber;
    };

暗示

#include "person.h"
#include <string>
#include <iostream>
using std::string;
using std::cout;


    person::person() : name("no name yet"), address("no address yet"), schoolname("no school name"), ssn("no number") , idnumber(0)
    {

    }



    person :: person(string theName, string theAddress, string theSchoolname, string theSsn, double theIdnumber): name(theName), address(theAddress), schoolname(theSchoolname), ssn(theSsn), idnumber(0)
    {

    }





    string person :: getName() const
    {
        return name;

    }
    string person :: getAddress() const
    {
        return address;
    }
    string person :: getSchoolname() const
    {
        return schoolname;

    }

    string person ::getSsn()const
    {
        return ssn;
    }

    double person :: getIdnumber() const
    {
        return idnumber;
    }

    void person :: setName(string newName)
    {
        name = newName;

    }
    void person :: setAddress(string newAddress)
    {
        address = newAddress;
    }
    void person :: setSchoolname( string newSchoolname)
    {
        schoolname = newSchoolname;

    }

    void person ::setSsn(string newSsn)
    {
        ssn =  newSsn;
    }

    void person ::setIdnumber( double newIdnumber)
    {
        idnumber = newIdnumber;
    }

派生类头

#ifndef student_h
#define student_h

#include "person.h"
#include <string>

class student : public person
{
public:
    student();
    student(student const& s);

    student( double theStudentid, string theGpa, string theCounselor, string theMajor, string theGraduatingclass );

    double getStudentid() const;
    void setStudentid(double newStudentid);

    string getGpa()const;
    void setGpa(string newGpa);

    string getCounselor() const;
    void setCounselor(string newCounselor);

    string getMajor() const;
    void setMajor(string newMajor);

    string getGraduatingclass() const;
    void setGraduatingclass(string newGraduatingclass);

    void readClasses();
    void printTranscript();
    void addClass(string , string , string );

protected: 
    double studentid;
    string gpa;
    string counselor; 
    string major;
    string graduatingclass;
    string classes[40];
    string transcript[40];
    string Class[100];
    char array[100];
    int counter;
};

#endif

实施

#include "student.h"
#include <string>
using namespace std;



    student::student() : gpa("none"), counselor("none"), major("none"), graduatingclass("none"), studentid(0)
    {

    }

    student :: student ( double theStudentid, string theGpa, string theCounselor, string theMajor, string theGraduatingclass):  studentid(0), gpa(theGpa), counselor(theCounselor), major(theMajor), graduatingclass(theGraduatingclass)
    {

    }


    double student :: getStudentid() const
    {
        return studentid;
    }
    string student :: getGpa() const
    {
        return gpa;
    }
    string student :: getCounselor() const
    {
        return counselor;
    }
    string student :: getMajor() const
    {
        return major;
    }
    string student :: getGraduatingclass() const
    {
        return graduatingclass;

    }

    void student :: setStudentid(double newStudentid)
    {
        studentid = newStudentid;
    }

    void student :: setGpa(string newGpa)
    {
        gpa = newGpa;
    }
    void student :: setCounselor(string newCounselor)
    {
        counselor = newCounselor;
    }

    void student :: setMajor(string newMajor)
    {
        major = newMajor;

    }


    void student :: setGraduatingclass(string newGraduatingclass)
    {
        graduatingclass = newGraduatingclass;
    }

Main.cpp

【问题讨论】:

  • 编译器告诉你什么?
  • Xcode 是集成开发环境 (IDE),而不是编译器。编译器与 IDE 是分开的。即使 Xcode 没有报告任何错误,编译器对你的程序是否编译拥有最终决定权。因此,您需要将 compiler 错误而不是 Xcode 错误复制并粘贴到您的问题中。另外,你手头有a good introductory C++ book 吗?这样一本书将涵盖这个主题以及更多内容。
  • 编译时会发生什么?如果编译失败,应该在某处出现错误消息,这对于解决这个问题至关重要。
  • @Sdsd Sdsd:不仅仅是“构建失败”。我们正在寻找编译器报告的错误,而不是Xcode报告的错误。编译器错误会告诉你出了什么问题。如果构建失败,那么编译器将不得不输出错误消息。
  • @In silico 架构 x86_64 的未定义符号:“person::~person()”,引用自:student::~student() in main.o student::student() in student。 o student::student(double, std::string, std::string, std::string, std::string) 在 student.o

标签: c++ oop inheritance constructor


【解决方案1】:

架构 x86_64 的未定义符号:“person::~person()”, 引用自:student::~student() in main.o student::student() in student.o student::student(double, std::string, std::string, std::string, std::string) 在 student.o

根据链接器错误,您缺少person::~person() 的定义,即person 的析构函数。在你的类声明头文件中,你有:

class person
{
public:
    // ...
    person();
    ~person();
    // ...
};

但是在你的实现文件中,你有:

// ...
person::person() {}
// Where's person::~person() {} ?
// ...

添加person::~person()的定义,它至少应该解决上述错误。

【讨论】:

  • @Sdsd Sdsd:如果它对您有帮助,请确保通过单击看起来像复选标记的东西来接受答案。为了将来参考,在 Stack Overflow 上提问时,您应该始终在问题中包含所有编译器错误。它将帮助我们提供更快的答案。
  • 感谢您的提醒!我很确定我打了支票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
相关资源
最近更新 更多