Производный класс не имеет доступа к унаследованной функции? - PullRequest
2 голосов
/ 12 мая 2011

Я создаю очень простую программу, которая включает наследование.Я поместил функцию в «защищенную» область родительского класса, и теперь у меня нет доступа из дочернего класса.Вот мой код:

class Product : protected Item 
{

private:

    double Price;

protected:

    double getPrice(){return Price;}


//other code not connected
};

Позже я получаю:

class Toy : protected Item
{

// class Toy code that does not mention getPrice() at all

 };

И после этого я получаю другой класс, в котором я на самом деле пытаюсь использовать функцию getPrice ().

В заголовочном файле нового класса:

class Game : protected Toy
{

  double printGame(){return getPrice();}
};

Эта строка не дает мне ошибки.

Но в файле game.cpp:

ostream& operator << (ostream& Output, const Game &printedGame)
{
 return Output 

 << "The game price is: "

 //This is the problem line

 << printedGame.printGame()

 << "." ;
 }

Слово "printGame" возвращает меня "Ошибка: объект имеет спецификаторы типов, которые не совместимы с функцией-членом"

Когда я пытался идти напрямую (что я пробовал ранее, как таковой):

printedGame.getPrice()

Я получаю эту ошибку, и еще одну, сообщающую мне, что функция getPrice () недоступна.

Любая помощь здесь?Спасибо !!

Ответы [ 5 ]

4 голосов
/ 12 мая 2011

Ваш оператор << вызывается с объектом const Game &, что означает, что функция может вызывать только const функции-члены из Game

Добавить const к getPrice и printGame:

double getPrice() const {return Price;}
double printGame() const {return getPrice();}

Вам также придется сделать printGame публичным.

0 голосов
/ 12 мая 2011

Я сделал удар, но мне пришлось сделать некоторые предположения, чтобы это сработало. Как написано, код должен работать

#include <iostream>

using std::ostream;

// I added this to make sure it looks close to your stated problem
class Item
{
};

class Product : protected Item 
{
private:    
    double Price;
protected:   
    // getter needs to be const, for the ostream operator to work
    double getPrice() const
    {
        return Price;
    }
};

// I changed this to derive from Product, otherwise, there's no inheritance tree.
// Is this what you intended to do?
class Toy : protected Product
{
};

class Game : protected Toy
{  
    // if you don't specify an access modifier, C++ defaults to private
public:
    // getter needs to be const, for the ostream operator to work
    double printGame() const
    {
        return getPrice();
    }
};

ostream& operator << (ostream& Output, const Game &printedGame)
{
    return Output  << "The game price is: " << printedGame.printGame() << "." ;
}

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
0 голосов
/ 12 мая 2011

Метод getPrice () является членом класса Product, но вы унаследованы от Item.

Кроме того, если вы так его называете, я считаю, что вам нужна функция const для вызова в классе Product

0 голосов
/ 12 мая 2011

getPrice доступен членам Game, но ваш operator<< не является участником, и не должен быть.

Вместо этого используйте объявление друга, чтобы предоставить operator<<(ostream&, const Game&) доступ.

class Product : protected Item 
{

private:

  double Price;

protected:

  double getPrice() const {return Price;}
};

class Toy : protected Product
{
};

class Game : protected Toy
{
  friend ostream& operator<<(ostream&, const Game&);
};

ostream& operator << (ostream& Output, const Game &printedGame)
{
  return Output 

   << "The game price is: "

   //This is the problem line

   << printedGame.getPrice()

   << "." ;
}
0 голосов
/ 12 мая 2011

Метод getPrice () является членом Product, а не Item.Таким образом, получение Toy из Item не даст ему доступ к getPrice ().Он должен был бы быть производным от продукта (или одного из его подклассов).

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