Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классовая переменная 
:(
    Опции темы
Riply
Дата 28.6.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Здравствуйте !

В Delphi возможно использование "классовых переменных".
Выглядит это примерно так:

Код

type
 TLevel_0 = class
  protected
  public
   procedure PresentItself; virtual;
  end;

procedure TLevel_0.PresentItself;
begin
 ShowMessage(ClassName);
end;

type
 TLevel_1 = class(TLevel_0)
  protected
  public
   procedure PresentItself; override;
  end;

procedure TLevel_1.PresentItself;
begin
 inherited PresentItself;
end;

type
 TCustomLevelClass = class of TLevel_0;

procedure WorkWithClass(AnyCondition: Boolean);
var
  CurrentClass: TCustomLevelClass;
begin
 if AnyCondition
   then CurrentClass := TLevel_1 
   else CurrentClass := TLevel_0;

 with CurrentClass.Create do
  try
   PresentItself;
  finally
   Free;
  end;
end;


Как в C++ можно изобразить подобное ?

PM MAIL   Вверх
Palladin
Дата 28.6.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: нет
Всего: 17



Код

class Palladin
{
private:
int klas_perem=17; //требуемая переменная
public:
void func()                 //метод юзающий переменную
{cout<<"Klas_perem= "<<klass_perem;}
};


Тут переменная klas_perem вроде как то что ты хотела smile

Добавлено через 1 минуту и 44 секунды
А соори я с просони сморозил и не гланул на твой код, ты вроде не это хотела

Добавлено через 2 минуты и 54 секунды
Delphi плохо знаю опиши что тебе нада сделать, я какойнить пример накидаю


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
W4FhLF
Дата 28.6.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Если я правильно понял смысл, то тебе нужен просто указатель на базовый класс:

Код

#include "stdafx.h"
#include <iostream>

using namespace std;

class B
{
public:
    B() {};
    B(const int b) { this->b = b; };
    ~B();


    virtual void print() 
    {
        cout << "B: " << b << endl;
    };

private:
    int b;
};

class A: public B
{
public:
    A() {};
    A(const int a) { this->a = a; };
    ~A();

    void print() 
    {
        cout << "A: " << a << endl;
    };

private:
    int a;
};

void foo(bool cond)
{
    B* ob;

    cond ? ob = new B(5) : ob = new A(6);

    try
    {
        ob->print();
    }
    catch (...)
    {
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    foo(true);
    foo(false);
    return 0;
}



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Riply
Дата 28.6.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Цитата(Palladin @  28.6.2008,  16:17 Найти цитируемый пост)
Delphi плохо знаю опиши что тебе нада сделать, я какойнить пример накидаю 


Да русский язык не такой богатый, как Delphi. 
Слов не хватает, но поробую  smile 


Цитата(W4FhLF @  28.6.2008,  16:45 Найти цитируемый пост)
Если я правильно понял смысл, то тебе нужен просто указатель на базовый класс:


Почти что так.

Вот что я хочу:

Код

void foo(ClassType * NeedClass)
{
                B* ob;

                ob = new NeedClass(5);

                try
                {
                                ob->print();
                }
                catch (...)
                {
                }
}


В твоем примере заранее известны возможные классы,
и мы из них выбираем.

А мне бы хотелось создавать тот класс, который указан в "классовой переменной"  NeedClass.
Если использовать терминологию из первого поста (Delphi) то что-то такое

type
 TCustomLevelClass = class of A;

var
  CurrentClass: TCustomLevelClass;

Далее мы можем этой переменной присваивать любой класс,
наследник класса A.
И использовать примерно так: ob = new CurrentClass;

Знаю, что сумбурно. Sorry.
PM MAIL   Вверх
MAKCim
Дата 28.6.2008, 18:07 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Код

class ClassType {
public:
    virtual void * create() const = 0;
};

template<class T> class ClassTypeImpl : public ClassType {
public:
    void * create() const {
        return new T();
    }
};

void foo(ClassType * NeedClass) {
    B * ob = NeedClass -> create();
    try {
        ob -> print()
    } catch(...) {}
}

int main() {
    ClassTypeImpl<B> * ptr;
    foo(ptr = new ClassTypeImpl<B>());
    delete ptr;
    return 0;
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
nickless
Дата 28.6.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



ЗЫ
Цитата(Riply @  28.6.2008,  16:51 Найти цитируемый пост)
TCustomLevelClass = class of A;

Это называется метакласс, а способ реализации предложенный MAKCim-ом - это паттерн фабричный метод


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Riply
Дата 29.6.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: нет
Всего: 32



Спасибо большое  smile 
PM MAIL   Вверх
rrrFer
Дата 29.6.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 11.5.2008
Где: Красноярск

Репутация: 0
Всего: 1



Цитата(nickless @  28.6.2008,  22:04 Найти цитируемый пост)
Это называется метакласс, а способ реализации предложенный MAKCim-ом - это паттерн фабричный метод

у нас на ООП другая терминалогия была,  TCustomLevelClass = class of A; назывался классом интерфейса, а вот как мы назввали фабричный метод я не вспомню...но точно не фабричным методом


Это сообщение отредактировал(а) rrrFer - 29.6.2008, 15:58
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.