İşaretçi kurucu ile işaretçi

C ++ 'da, aşağıdakilere nasıl ulaşabilirim:

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

Diğer bir deyişle, Cake işaretçisini yapıcısına alan bir Player işaretçisi olsun.

Ancak, uygulamayı g ++ ile derlemeye çalıştığımda aşağıdaki hatayı alıyorum: hatası: * Kek * (*)() ’i, başlatılmakta olan '‘ Player * ’a dönüştürebilir.

Muhtemelen mantıklı, ama neden işaretçiyi (kurucuda) alan bir işaretçiye sahip olamadığımı bilmek istiyorum .

0
Bu sadece yaptığım kukla bir uygulama, "gerçek" uygulama biraz farklı görünüyor. İşaretçiyi kullanmadığımda kalıtımla ilgili bazı problemlerim vardı (ör., Üst sınıftaki sanal işlevler, her zaman amaç, bir alt sınıfın devralınan işlevini çağırmak olduğunda çağrıldı).
katma yazar whirlwin, kaynak
Otomatik değişkenlerle ilgili sorun nedir? Kek keki; Oyuncu (pasta); çok daha kolay ve daha iyi.
katma yazar sbi, kaynak
Aman. Kulağa kötü geliyor. Kendinizi iyi bir C ++ kitabı almak isteyebilirsiniz.
katma yazar sbi, kaynak

4 cevap

Cake* cake();

Burada pasta </​​code>, üstlenebileceğiniz bir değişken değildir. Derleyici, kek() Cake * öğesini döndüren ve hiçbir argüman almayan bir ileri bildirim olarak görünüyor.

Olabilir,

Cake cake;
Player *player = new Player(&cake);
2
katma

Bu yanlış yerel başlatma gibi görünüyor.

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

yeniden yazılması gerekiyor

Cake* cake = new Cake();
Player* player = new Player(cake);
2
katma

Bu uygun C ++ sözdizimi:

Cake* cake = new Cake();
Player* player = new Player(cake); 
1
katma

Kek, player.h'de bilinmeyen bir türüdür. İleri bir bildirim kullanın:

// player.h

class Cake;

class Player
{
  private:
    Cake* m_cake;
  public:
    Player( Cake* c ) : m_cake(c) {}
};
1
katma