Паказальнік з канструктарам паказальнік

У C ++, як я магу дамагчыся наступнага:

// player.h
#ifndef PLAYER_H
#define PLAYER_H
class Player {
    public:
        Player(Cake* cake);
}
#endif

// player.cpp
#include "cake.h"
#include "player.h"
Player::Player(Cake* cake) { }

// cake.h
#ifndef CAKE_H
#define CAKE_H
class Cake {
    public:
        Cake( );
}
#endif

// cake.cpp
#include "cake.h"
Cake::Cake() { }

// main.cpp
#include "player.h"
#include "cake.h"
int main() {
    Cake* cake();
    Player* player(cake);//This does not work

    return 0;
}

Іншымі словамі, Вы Гулец паказальнік, які прымае Cake паказальнік у гэта канструктар.

Аднак, калі я спрабую кампіляцыі прыкладання з г ++ я атрымліваю наступнае паведамленне пра памылку: <Код> Памылка: не ўдаецца пераўтварыць «Cake * (*) ()» да «гульца *» у ініцыялізацыі .

Гэта, верагодна, мае сэнс, але я хацеў бы ведаць, чаму я не магу мець <моцны> паказальнік, які прымае паказальнік (у канструктару) .

0
Гэта проста манекен прыкладання я зрабіў, "рэальнае" прыкладанне выглядае крыху па-іншаму. У мяне былі некаторыя праблемы з ўспадкоўванне, калі я не выкарыстаў паказальнікі (напрыклад віртуальныя функцыі ў бацькоўскай класе, здавалася, датэлефанаваўся кожны раз, калі мэта складалася ў тым, каб выклікаць даччыны клас атрымала ў спадчыну функцыю.
дададзена аўтар whirlwin, крыніца
Што здарылася з аўтаматычнымі зменнымі? <Код> торт торт; Гулец гулец (торт); нашмат прасцей і лепш.
дададзена аўтар sbi, крыніца
Аб мой. Гэта гучыць дрэнна. Вы можаце атрымаць сабе добрую кнігу C ++ .
дададзена аўтар sbi, крыніца

4 адказы

Cake* cake();

Тут торт не з'яўляецца зменнай, як вы маглі б выказаць здагадку. Кампілятар выглядае, як калі торт() з'яўляецца апераджальнае аб'яву, якое вяртае Пірог * і не прымае ніякіх аргументаў.

Гэта можа быць,

Cake cake;
Player *player = new Player(&cake);
2
дададзена

Гэта падобна на памылковую лакальную ініцыялізацыю.

Cake* cake();
Player* player(cake);

неабходна перапісаць

Cake* cake = new Cake();
Player* player = new Player(cake);
2
дададзена

Гэта сінтаксіс уласна C ++:

Cake* cake = new Cake();
Player* player = new Player(cake); 
1
дададзена

Торт невядомага тыпу ў player.h. Выкарыстоўвайце апераджальнае аб'ява:

// player.h

class Cake;

class Player
{
  private:
    Cake* m_cake;
  public:
    Player( Cake* c ) : m_cake(c) {}
};
1
дададзена