ポインタコンストラクタを持つポインタ

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;
}

つまり、 Player ポインタを持って、そのコンストラクタに Cake ポインタを置いてください。

しかし、 g ++ でアプリケーションをコンパイルしようとすると、次のエラーが発生します。 エラー:初期化で 'Cake *(*)()'を 'Player *'に変換できません

おそらく意味をなさないでしょうが、私はコンストラクタ内のポインタを取るポインタを持つことができない理由を知りたいと思います。

0
これは私が作ったちょうどダミーのアプリケーションです、 "本当の"アプリケーションは少し違って見えます。私はポインタを使用しなかったときに継承にいくつかの問題がありました(例えば、親クラスの仮想関数は、子クラスの継承関数を呼び出す目的があるたびに呼び出されるようです。
追加された 著者 whirlwin,
自動変数の何が問題になっていますか? ケーキケーキ;プレーヤープレーヤー(ケーキ); の方がはるかに簡単で優れています。
追加された 著者 sbi,
ああ、私。それは悪いね。あなたは良いC ++の本を手に入れたいと思うかもしれません。
追加された 著者 sbi,

4 答え

Cake* cake();

ここで、 cake は変数ではありません。コンパイラは、 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
追加された

Cakeはplayer.hの中では未知の型です。前方宣言を使用してください:

// player.h

class Cake;

class Player
{
  private:
    Cake* m_cake;
  public:
    Player( Cake* c ) : m_cake(c) {}
};
1
追加された