Как получить доступ к закрытым переменным родительского класса в дочернем классе в C ++ - PullRequest
0 голосов
/ 17 октября 2018

Можете ли вы взглянуть на мой перегруженный оператор для класса пакета в моем коде ниже.Можно ли получить доступ к закрытым переменным родительского класса в дочернем классе?То, что я сделал, я использовал функции-члены для написания перегруженного оператора для класса пакета, но он говорит: «Переменная '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 голосов
/ 17 октября 2018

Когда вы используете публичное наследование, все открытые и защищенные члены базового класса становятся открытыми и защищенными в производном классе.В вашем примере runTime и movieName являются частными, поэтому вы не можете получить к ним доступ из-за пределов класса.

Кроме того, runTime и movieName уже являются частными в Parent.После объявления закрытым член всегда остается закрытым для базового класса независимо от типа наследования.Чтобы получить доступ к runTime и movieName, измените Parent на:

protected:
    int    runTime;
    string movieName;

Если вы хотите получить доступ к элементу размера из производного класса, но не из этого класса, тогда вы хотите защитить.

ИВы должны унаследовать ребенка от:

class Package : public Ticket
0 голосов
/ 17 октября 2018

Сделайте ваши 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 является константным параметром ...( Тот, который не допускает никаких модификаций внутри себя, но может быть назначен напрямую извне, следовательно, используется оператор ссылки ), а разрешает только постоянные функции-члены ( Функции, которые не позволяютпринять участие в изменении членов класса ... ) для вызова из себя ... И так как мы объявили getMovieName() и getRunTime() постоянными функциями ... Они выполняютсяправильно ...


Примечание: ВыВам следует посетить здесь , чтобы узнать больше о различных способах передачи значения параметру определенного типа ...

0 голосов
/ 17 октября 2018

Вы можете использовать функцию operator<<, определенную для базового класса в реализации производного класса.

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

Это уменьшает дублирование кода и устраняет проблему с доступом private к члену.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...