дизайн взаимодействия классов - PullRequest
0 голосов
/ 21 октября 2010

Допустим, у меня есть что-то вроде этого

class Normal_Mode;
class Fast_Mode;
class File_Control; //handles all operations with reading/writing in file
class Main_Control {
 private:
 some_class *root; //all other classes need access to root pointer since there is all the data(binary tree)
 File_Control *c_file_control;
 Fast_Mode *c_fast_mode;
...
}

Main_Control::Main_Control ( int argc, char* argv[]) {
  ...
  if ( argc > 1 ) {
   c_fast_mode = new Fast_Mode(argc, argv[]);
  } else {
   c_normal_mode = new Normal_Mode();
  };
  ...
};

int main (int argc, char* argv[]) {
 Main_Control c_main_control(argc,argv);
 return 0;
}

Допустим, пользовательский ввод имел argc> 1, и я счастлив делать что-то с пользовательским вводом в классе Fast_Mode, но когда я закончу и захочу записать что-то в файл или прочитать что-нибудь из файла, находясь в Fast_Mode. Как люди в реальном мире получают доступ к классу File_control?

Делают ли они какой-нибудь глобальный массив, заполненный указателями на такие классы, которым нужен только 1 экземпляр.

Они передают указатели Fast_Mode и другим классам, чтобы он мог хранить их в приватных членах для доступа.

или они все время строят / уничтожают такие классы, в зависимости от того, когда это необходимо.

И что они делают с таким * корневым указателем, в котором хранятся все фактические данные и для доступа к нему требуется множество других классов

Или мои дизайнерские идеи совершенно неверны, и люди в реальном мире делают это по-другому?

1 Ответ

0 голосов
/ 21 октября 2010

Я действительно не знаю, чего вы пытаетесь достичь с помощью этого: если возможно, сделайте вашу цель более ясной, но я бы сказал, что люди обычно создают абстрактный интерфейс с именем «Mode», а затем имеют Normal_Mode и Fast_Mode. реализовать это. Таким образом, вы можете написать следующий код:

class Main_Control {
    private:
       some_class *root; //all other classes need access to root pointer since there is all the data(binary tree)
       File_Control *c_file_control;
       Mode *c_mode;
       ...
};

И тогда вы можете установить его следующим образом:

if ( argc > 1 ) {
   c_mode = new Fast_Mode(argc, argv[]);
} else {
   c_mode = new Normal_Mode();
};

Таким образом, вы просто помещаете общие функции в интерфейс Mode, чтобы они вели себя одинаково, но могли быть помещены в одну переменную mode. Чтобы узнать больше о наследовании классов и полиморфизме, посмотрите здесь . Я надеюсь, что это отвечает на ваш вопрос.

...