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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использованиe макросов 
:(
    Опции темы
sol78
Дата 25.4.2008, 13:18 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



помогите найти ошибку при использовании макросов...
Я пишу что то вроде рефлекшн (паттерн виртуальний конструктор)
наследники класса RTOC получаут возмозность использовать рефлек.
для етого они должни пройти регистрацию...

Код

#ifndef _RTOC
#define _RTOC
#define MAXSIZE 100
#include <cstring>
#include "Registration.h"

#define RTOC_DECLARATION(CLASS) \
     char* getClassID()const;\
     RTOC* getInstance()const;\
     CLASS(Registration* r);

#define RTOC_DEFINITION(CLASS) \
    char* getClassID()const\
{\
    return "CLASS";\
}\
    RTOC* getInstance()const\
{\
    return new CLASS();\
}\
CLASS(Registration* r):RTOC(this){}
      

class RTOC
{
    static RTOC** arr;
    static int counter;

    void addInstanceClass(RTOC* p);
    void copyTable(RTOC** newTable); 
    static RTOC* SearchInstanceByName(const char* class_name);

public:
    RTOC(RTOC* p=0);
    virtual ~RTOC(){};
    static RTOC* getInstanceByName(const char* class_name);
protected:
    virtual char* getClassID()const=0;
    virtual RTOC* getInstance()const=0;
};

#endif


класс наследник от RTOC, для регистрации должен вызвать смачала тут макрос RTOC_DECLARATION(X);

Код

#ifndef _X
#define _X
#include "rtoc.h"
#include <iostream.h>

class X: public RTOC
{
    int i;
public:
    X(int num=0):i(num){}
    RTOC_DECLARATION(X);

   void set(int num)
   {
       i=num;
   }
   void Display()
   {
       cout<<i<<endl;
   }
};

#endif



и потом тут RTOC_DEFINITION(X);

Код

#include "X.h"

RTOC_DEFINITION(X);


в идеале эта схема должна использоваться для организации рефлекшн
вот так:
Код

#include "X.H"

void main()
{
    char* str="X";
    RTOC* p = RTOC::getInstanceByName(str);
    ((X*)p)->set(5);
    ((X*)p)->Display();
}


но не работает дает ошибку при вызове макроса((((((????????


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


Опытный
**


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

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



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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(sol78 @  25.4.2008,  12:18 Найти цитируемый пост)
но не работает дает ошибку при вызове макроса((((((????????

Ау, ошибку-то давай. И номер строки.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Dennnis
Дата 25.4.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В том коде который ты сдесь привет ошибок нет. Может ошибка в реализации методов
    void addInstanceClass(RTOC* p);
    void copyTable(RTOC** newTable); 
    static RTOC* SearchInstanceByName(const char* class_name);
    RTOC(RTOC* p=0);
    static RTOC* getInstanceByName(const char* class_name);
или в Registration.
Вот это у меня работает.
Код

class Registration;

#define RTOC_DECLARATION(CLASS) \
     char* getClassID()const;\
     RTOC* getInstance()const;\
     CLASS(Registration* r);

#define RTOC_DEFINITION(CLASS) \
    char* getClassID()const\
    {\
        return "CLASS";\
    }\
    RTOC* getInstance()const\
    {\
        return new CLASS();\
    }\
CLASS(Registration* r):RTOC(this){}
      
class RTOC
{
    static RTOC** arr;
    static int counter;
    void addInstanceClass(RTOC* p){};
    void copyTable(RTOC** newTable){}; 
//    static RTOC* SearchInstanceByName(const char* class_name);
public:
    RTOC(RTOC* p=0)
    {
    }
    virtual ~RTOC(){};
    static RTOC* getInstanceByName(const char* class_name)
    {
        return NULL;
    }
protected:
    virtual char* getClassID()const=0;
    virtual RTOC* getInstance()const=0;
};


#include <iostream>
using namespace std;
class X: public RTOC
{
    int i;
public:
    X(int num=0):i(num){}
    /*
    RTOC_DECLARATION(X);
*/
    RTOC_DEFINITION(X)
   void set(int num)
   {
       i=num;
   }
   void Display()
   {
       cout<<i<<endl;
   }
};


int _tmain(int argc, _TCHAR* argv[])
{
    char* str="X";
    RTOC* p = RTOC::getInstanceByName(str);
    ((X*)p)->set(5);
    ((X*)p)->Display();
    return 0;
}

--------------------
Get Rich or Die Tryin'
PM   Вверх
sol78
Дата 26.4.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот ошибки:

D:\MSDev98\MyProjects\RTOC\X.CPP(3) : error C2270: 'getClassID' : modifiers not allowed on nonmember functions
D:\MSDev98\MyProjects\RTOC\X.CPP(3) : error C2270: 'getInstance' : modifiers not allowed on nonmember functions
D:\MSDev98\MyProjects\RTOC\X.CPP(3) : warning C4355: 'this' : used in base member initializer list
D:\MSDev98\MyProjects\RTOC\X.CPP(3) : error C2673: 'X' : global functions do not have 'this' pointers
D:\MSDev98\MyProjects\RTOC\X.CPP(3) : error C2550: 'X' : constructor initializer lists are only allowed on constructor definitions
D:\MSDev98\MyProjects\RTOC\X.CPP(3) : warning C4508: 'X' : function should return a value; 'void' return type assumed
Error executing cl.exe.

X.OBJ - 4 error(s), 2 warning(s)

падает на строке:
RTOC_DEFINITION(X);
в файле X.CPP

Кроме того, ошибка - нужно как то вызывать этот виртуальний конструктор
типа того:
Код

Registration r_obj;
CLASS(&r_obj);

где это лучше сделать?

Это сообщение отредактировал(а) sol78 - 26.4.2008, 21:11
PM MAIL   Вверх
sol78
Дата 26.4.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблема с компиляцией решена!
Путем исправления макроса :
Код

#define RTOC_DEFINITION(CLASS) \
    char* CLASS::getClassID()const\
    {\
        return "CLASS";\
    }\
    RTOC* CLASS::getInstance()const\
    {\
        return new CLASS();\
    }\
CLASS::CLASS(Registration* r):RTOC(this){}



Теперь мне нужно знать где этот конструктор лучше вызвать?
PM MAIL   Вверх
sol78
Дата 27.4.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вопрос остается не решенным....
Где и каким способом вызывать этот коструктор, интуитивно - это должно происходить из макроса
типа того:
Код

Registration r_obj;
CLASS(&r_obj);

но где это лучше сделать?
может ктото писал уже такие формы???
PM MAIL   Вверх
chipset
Дата 27.4.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата(sol78 @  25.4.2008,  03:18 Найти цитируемый пост)
    RTOC* p = RTOC::getInstanceByName(str);

ИМХО лучше

Код

X *inst = RTOC::getInstanceByName("X");


Тогда очевидно (или я чтото упустил?) не придеца плодить вот такие what-the-fuck'и:
Код

((X*)p)->set(5);
((X*)p)->Display();


Это раз. А во вторых, я думаю наилучшим решение была бы замена addInstanceClass на две функции типа addConstructedInstance и addLazyInstance. В первом случае ктр вызывается в addInstance класс, во втором при getInstanceByName("X");

Единственная серьёзная проблема у тебя это параметризация конструкторов. И вообще применимость. Я не вижу где собираются методы и параметры классов?





--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
sol78
Дата 28.4.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

ИМХО лучше


код C++ 
1:

 X *inst = RTOC::getInstanceByName("X");

зависит от реализации...
Цитата

Это раз. А во вторых, я думаю наилучшим решение была бы замена addInstanceClass на две функции типа addConstructedInstance и addLazyInstance. В первом случае ктр вызывается в addInstance класс, во втором при getInstanceByName("X");

не вижу смысла...обьясни?
Цитата

Единственная серьёзная проблема у тебя это параметризация конструкторов. И вообще применимость. Я не вижу где собираются методы и параметры классов?

тут вообще не понятно...


моя проблема состоит в том...что юзеру нужно придоставить возможность регистрации, но так чтобы он не имел доступ к реализации методов отвечающих за регистрацию...
Я решила эту проблему с помощью макросов:

Код

 RTOC_DECLARATION(X);//декларация методов для регистрации
 RTOC_DEFINITION(X); //определение методов для регистрации

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

PM MAIL   Вверх
math64
Дата 28.4.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



А почему не пользуетесь template?
Код

#include <stdio.h>
class B {
};

typedef B* MakeB();

class Register {
public:
static void add(MakeB m, const char* s) {
printf("%s:%p\n", s, m);
}
};

template <class T> class Reg {
private:
  static Reg reg;
  static B* makeInstance() { return new T; }
  Reg(const char* name) { Register::add(makeInstance, name); }
};

class C : public B { };

Reg<C> Reg<C>::reg("C");

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


Опытный
**


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

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



math64, таковы были условия проекта
PM MAIL   Вверх
sol78
Дата 29.4.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблему вызова решла через статически обьект класса:
Код

#define RTOC_DECLARATION(CLASS) \
    static CLASS cl;\
     char* getClassID()const;\
     RTOC* getInstance()const;\
     CLASS(Registration* r);
    // Registration r_obj;\
    // CLASS(&r_obj);

#define RTOC_DEFINITION(CLASS) \
    char* CLASS::getClassID()const\
{\
return "CLASS" ;\
}\
    RTOC* CLASS::getInstance()const\
{\
return new CLASS();\
}\
CLASS::CLASS(Registration* r):RTOC(this){}\
CLASS CLASS::cl=CLASS(&Registration());


 
но заметила такую гадасть....
char* CLASS::getClassID()const\
{\
return "CLASS" ;\
}\

привызове этой функ. она мне возращает "CLASS",а мне нужно что то вроде "Х" где может быть ошибка?




PM MAIL   Вверх
Mayk
Дата 29.4.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Цитата(sol78 @  29.4.2008,  18:57 Найти цитируемый пост)

привызове этой функ. она мне возращает "CLASS",а мне нужно что то вроде "Х" где может быть ошибка?

вместо "CLASS" пиши #CLASS. В строковых литералах макросы не заменяюцца.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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