如何在C ++中访问子类中父类的私有变量

时间:2018-10-17 06:06:43

标签: c++ c++17

您能否在下面的代码中查看我对于包类的重叠运算符。是否可以在子类中访问父类的私有变量?我所做的是我使用成员函数为程序包类编写了一个重载运算符,但是它说“变量't'在这里使用时未初始化”。 转到末尾,您将看到重叠的运算符。

#include <iostream>
using namespace std;

// Ticket Class
class Ticket
{
    private:
        int    runTime;
        string movieName;

    public:
        Ticket(int, string);
        void   setMovieName(string);
        void   setRunTime(int);
        string getMovieName();
        int    getRunTime();
        friend ostream &operator <<(ostream &stream, const Ticket&);
};


// Package Class
class Package : public Ticket
{
    private:
        string snackName;

    public:
        Package(int, string, string);
        void   setSnackName(string);
        string getSnackName();
        friend ostream &operator <<(ostream &stream, const Package&);
};




int main()
{



}




// Ticket Class empty constructor
Ticket::Ticket(int rnTime, string mvTime) : runTime(rnTime), movieName(mvTime){}


// Ticket Class setter
void Ticket::setMovieName(string mv)
{
    movieName = mv;
}

// Ticket class setter
void Ticket::setRunTime(int rn)
{
    runTime = rn;
}

// Ticket class getter
string Ticket::getMovieName()
{
    return movieName;
}

// Ticket Class getter
int Ticket::getRunTime()
{
    return runTime;
}

// Ticket class friend overloaded function
ostream &operator <<(ostream &stream, const Ticket &t)
{
    stream << "Movie name: " << t.movieName << endl;
    stream << "Run time: "   << t.runTime   << endl;
    return stream;
}

// Child Class empty Constructor
Package::Package(int rnTime, string mvTime, string snTime) : Ticket(rnTime,mvTime), snackName(snTime){}


// Package Class setter
void Package::setSnackName(string sn)
{
    snackName = sn;
}

// Package Class Getter
string Package::getSnackName()
{
    return snackName;
}

// Package class friend overloaded function
ostream &operator <<(ostream &stream, const Package &p)
{
    Ticket *t; // compilers says "Variable 't' is uninitialized when used here"

    stream << "Movie: "      << t->getMovieName() << endl;
    stream << "Run time: "   << t->getRunTime()   << endl;
    stream << "Snack name: " << p.snackName       << endl;
    return stream;
}

3 个答案:

答案 0 :(得分:3)

使您的 get 函数保持不变,如下所示:

string getMovieName() const; // <- Note the const specifier
int    getRunTime() const;   // <- Note it here as well...
  

由于这些函数只不过是返回值而已...因此,建议始终对所有不修改私有变量的get函数进行此操作...

在定义中也做同样的事情...

二进制operator<<可以简单地定义为:

ostream &operator <<(ostream &stream, const Package &p)
{
    stream << "Movie: " << p.getMovieName() << endl;
    stream << "Run time: " << p.getRunTime() << endl;
    stream << "Snack name: " << p.snackName << endl;
    return stream;
}
  

注意:之所以起作用,是因为常量const Package &p const限定的参数 ...(自身内部的任何修改都可以,但可以直接从外部进行分配,因此可以使用引用运算符),而仅允许使用常量成员函数(不参与修改类成员的函数)。 .. )本身被调用... 由于我们已将getMovieName()getRunTime()声明为常量函数,因此它们可以正确运行。 ..


  

注意:您应该考虑访问here,以了解有关如何将值传递给特定类型的参数的不同方式...

答案 1 :(得分:2)

您可以在派生类的实现中使用为基类定义的operator<<函数。

ostream &operator <<(ostream &stream, const Package &p)
{
    Ticket const& t = p;
    stream << t;
    stream << "Snack name: " << p.snackName << endl;
    return stream;
}

这可以减少代码重复并避免private成员访问问题。

答案 2 :(得分:0)

当您使用公共继承时,基类的所有公共成员和受保护成员在派生类中都将变为公共并受到保护。在您的示例中,runTime和movieName是私有的,因此您不能从外部类访问它。

此外,runTime和movieName在Parent中已经是私有的。一旦声明为私有,成员就始终对基类保持私有,而不管继承的类型如何。 要访问runTime和movieName,请将Parent更改为:

protected:
    int    runTime;
    string movieName;

如果要从派生类而不是从类外部访问size成员,则需要保护。

您应该通过以下方式继承Child:

class Package : public Ticket
相关问题