Указатель с помощью конструктора указателей - PullRequest
0 голосов
/ 28 октября 2011

В 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++, я получаю следующую ошибку: error: cannot convert ‘Cake* (*)()’ to ‘Player*’ in initialization.

Возможно, это имеет смысл, но я хотел бы знать, почему у меня не может быть указатель, который берет указатель (в конструкторе) .

Ответы [ 4 ]

2 голосов
/ 28 октября 2011
Cake* cake();

Здесь cake не является переменной, как вы могли бы предположить.Компилятор выглядит так, как будто cake() является предварительным объявлением, которое возвращает Cake* и не принимает аргументов.

Может быть,

Cake cake;
Player *player = new Player(&cake);
2 голосов
/ 28 октября 2011

Это похоже на ошибочную локальную инициализацию.

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

необходимо переписать на

Cake* cake = new Cake();
Player* player = new Player(cake);
1 голос
/ 28 октября 2011

Торт неизвестного типа в player.h. Используйте предварительную декларацию:

// player.h

class Cake;

class Player
{
  private:
    Cake* m_cake;
  public:
    Player( Cake* c ) : m_cake(c) {}
};
1 голос
/ 28 октября 2011

Это правильный синтаксис C ++:

Cake* cake = new Cake();
Player* player = new Player(cake); 
...