Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt]получить доступ к классу через указатель void*


Автор: IKM2007 14.3.2010, 23:26
В классе есть указатель типа void*.

Код

class MainClass : public QWidget, public Ui::Form
{
Q_OBJECT
...
    private:
    void *pToItem;
};


как для него выделить память другого типа? Делаю просто так: 
Код

...
pToItem = new Client(this);
...

но не получается. 

Автор: JackYF 14.3.2010, 23:55
Цитата(IKM2007 @  14.3.2010,  22:26 Найти цитируемый пост)
но не получается

а конкретнее?

Автор: IKM2007 15.3.2010, 16:19
Есть классы клиента и сервера.
Код

class Client : public QWidget
{
Q_OBJECT

public:
    Client(QWidget *parent = 0);

public slots:
    void connectToServer();
    void isConnected();
    void sendToServer(QString message);
    QString readServer();
private:
    void closeConnection();
    QTcpSocket tcpSocket;
    quint16 nextBlockSize;

};


Код

class Server: public QTcpServer
{
Q_OBJECT
    public:
    Server(QWidget *parent = 0);

    private:
    void incomingConnection(int socketId);

};


В главном классе приложения есть два слота : CreateClient() и CreateServer(), смотря какую кнопку мы нажали : Connect или Create Server. 
Код

class MainClass : public QWidget, public Ui::Form
{
Q_OBJECT
public:
    MainClass(QWidget *parent = 0);
private slots:
    void CreateClient();
    void CreateServer();
    void sendMessage();
    void readMessage();

    private:
    void *pToItem;
};


В этих слотах для указателя pToItem выделяю память соответственно для клиента и для сервера. Пока никаких ошибок нету. Но когда в методе sendMessage() пытаюсь вызвать методы класса Client или класса Server, то выдает ошибку : 
Код

error: `void*' is not a pointer-to-object type


Автор: djamshud 15.3.2010, 16:27
Проблема не в Qt, а в незнании плюсов -> разделом ошиблись.

ЗЫ. Суть проблемы в том, что компилятор не знает о существовании методов у объекта якобы типа void. Если приспичило городить такой огород, можно сделать так:

Код

void *obj=new Object;
...
reinterpret_cast<Object*>(obj)->somemethod();


ЗЗЫ. Советую перепроектировать.

Автор: IKM2007 15.3.2010, 16:45
Спасибо. +

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)