C ++ - Как вызвать создатель класса / объекта - PullRequest
1 голос
/ 06 августа 2010

Мне нужно вызывать свойства и функции объекта из другого класса.

Идея заключается в передаче 'this' в качестве параметра другому конструктору класса.Например:

instance = ClassName(this);

А затем выполните:

ParentClass parentInstance;
ClassName::ClassName(MainApp _instance){
    parentInstance = _instance;
}

Однако мой компилятор говорит, что ParentClass не называет тип.Идеи?Кроме того, я должен использовать указатель для экономии памяти?Как?

Заранее спасибо.


ОБНОВЛЕНИЕ:

Хорошо, извините за задержку.Здесь идет фактический код.Сначала простой класс.

Класс игры:

Заголовочный файл

#ifndef _GAME
#define _GAME

#include "ofMain.h"

class Game{

 public:
  Game();
  ~Game();

  void hi();
};

#endif

Файл cpp:

#include "Game.h"
Game::Game(){}
Game::~Game(){}

void Game::hi(){ 
cout << "hi, I'm game! " << endl;
}

Затем из MainApp создаюобъект: - Соответствующий код в заголовочном файле:

#ifndef _MAIN_APP
#define _MAIN_APP

#include "ofMain.h"
#include "Game.h"

class MainApp : public ofSimpleApp{
 public:
  Game game;
};

#endif

Соответствующий код в файле cpp:

game = Game();
game.hi();

Это, очевидно, работает, поскольку я создаю только кровавый объект.Однако проблема возникает с композицией.

Я мог бы передать главное приложение в качестве аргумента в конструкторе, я мог бы передать его через game.setParent (this); ... проблема в том, что я даже не могу определитьпеременная для хранения ссылки на приложение.

Например: (что делает его простым / неэффективным без указателей или чего-либо еще)

Game.h:

#define _GAME
#ifndef _GAME

#include "ofMain.h"
#include "MainApp.h"

class Game{
 MainApp app;

 public:
  Game();
  ~Game();

  void hi();
 };
#endif

ВозвращаетОшибка «не называет тип» и объявление class MainApp возвращает ошибку «неполный тип»

Я уверен, что делаю что-то глупое.


ОБНОВЛЕНИЕ2:

Проблема этого метода заключается в том, что я не могу сейчас вызвать функцию заостренного объекта.

Это Game.h:

#ifndef _GAME
#define _GAME

#include "ofMain.h"

class MainApp;
class Game{


 public:
  Game();
  Game(MainApp* _app);
  ~Game();

  void hi();

  MainApp* app;
};

#endif

Как видите, приложение (типа MainApp) передается в качестве параметра.Это нормально, MainApp существует, так как это предварительное объявление.Однако, когда я пытаюсь вызвать любую из функций приложения, я не могу (ошибка компилятора, говорящая о Запросе члена appHi в ...., который не является типом класса 'MainApp'.

MainApp НЕ включен в Игру.h, но Game.h включен в MainApp.h.

Идеи?

Ответы [ 7 ]

2 голосов
/ 16 августа 2010

Проблема в том, что у вас есть круговая ссылка - игра включает в себя MainApp, а MainApp включает в себя игру. Вам нужно «предварительное объявление», как в примере с DeadMG.

См. здесь .

1 голос
/ 06 августа 2010

Обратите внимание на раздел "#include".http://www.cplusplus.com/doc/tutorial/program_structure/

После раздела «Введение в язык C ++» найдите словосочетание о #include.http://www.cprogramming.com/tutorial/lesson1.html

Пространства имен: http://www.tenouk.com/Module23.html

HTH

1 голос
/ 06 августа 2010

Я думаю, здесь могут быть две проблемы:

1) Вам необходимо объявить ParentClass (например, #include его .hpp-файл) перед его использованием

2) Присвоение "parentInstance = _instance" вызовет оператор присваивания, который, как я предполагаю, не тот, который вы хотите. пусть указатель parentInstance будет взамен.

0 голосов
/ 16 августа 2010

Если все, что вам нужно сделать, это использовать функции и члены-данные другого класса, прочитайте ключевое слово friend.Это позволит получить доступ к членам класса из других классов.

ОБНОВЛЕНИЕ: Альтернативно, сохраните указатель или ссылку на объект, к которому вам нужен доступ, и сделайте получатели для членов данных и сделайте функции общедоступными ... но япочувствовать, что это не то, что вам нужно ...

0 голосов
/ 11 августа 2010

Мадсен здесь на правильном пути, но нам нужно больше кода;Что такое иерархия классов ParentClass, ClassName и SaleraApp.Какие классы являются базовыми и / или производными?

Когда вы пишете: parentInstance = _instance;компилятор попытается сгенерировать конструктор копирования по умолчанию, если он не определен.Ваша проблема может заключаться в том, что вы пытаетесь создать объект класса dervied из указателя базового класса.

Также «this» - это указатель.

0 голосов
/ 06 августа 2010

Это называется композиция и является распространенным паттерном.Он очень эффективен как в семантике, так и с точки зрения скорости выполнения / объема памяти.

Ваш пример кода - это слишком большой псевдокод, чтобы я мог его правильно прочитать.Позвольте мне показать вам, как это делается.

class X;
class Y {
    ...
    void DoSomething(X* x, ... args);
};
class X {
    Y y;
    void DoSomething() {
        y.DoSomething(this, args);
    }
};
0 голосов
/ 06 августа 2010

В C ++ все не так.В отличие от javascript, вы не можете внедрять методы или поля в существующие объекты во время выполнения.

...