crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> доступ к данным
KuvshinoF
  опции профиля:
сообщение 26.12.2016, 20:28
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть класс A
class A
{
private:
int iValue;

public (или private?):
void setValue(int v) {iValue=v;}
int getValue() {return iValue;}
}
extern A objA;

также есть некие классы B, C...
Вопрос: можно ли (если да, то подскажите пож-та на примере) сделать так, чтобы в классе В можно было бы пользоваться (компиляция без ошибок) методами и setValue, и getValue класса А,
а в классе С — ТОЛЬКО методом getValue?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 27.12.2016, 8:25
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2886
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 199 раз(а)




Репутация:   34  


а иерархия классов то какая ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
KuvshinoF
  опции профиля:
сообщение 27.12.2016, 21:36
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


класс В ничего не знает про С и наоборот....но надо в класс С передать некие данные из класса В через контейнер - класс А...хотелось бы чтобы класс В мог только класть данные в некие методы-класса А, а класс С - только чтобы имел возможность брать эти данные из А...через connect передавать данные не хотелось бы, так как таких передач достаточно много и важно быстродействие...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 29.12.2016, 7:44
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2886
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 199 раз(а)




Репутация:   34  


насчёт connect - можно указать тип подключения (прочитай про enum Qt::ConnectionType ). Если всё происходит в одном потоке, то есть возможность вызывать слоты напрямую (Qt::DirectConnection)

Если вдруг тесты покажут, что скорость работы неудовлетворительна, то придётся сделать нечто вроде

B b;
C c;
QVector<A> list;//однопоточный вариант. Для многопоточности - синхронизировать доступ


"b" добавляет сообщения в конец list, "c" выбирает сообщения из начала list
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 30.12.2016, 2:53
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1628
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 226 раз(а)




Репутация:   12  


тут стандартно используются интерфейсы. объявляются два абстрактных интерфейса (один с чтением и записью, второй только с чтением). класс А реализует (наследует от) оба интерфейса, классы В и C,соответственно, - только интерфейсы с нужными им методами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
KuvshinoF
  опции профиля:
сообщение 30.12.2016, 19:18
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


Iron Bug: а подскажите это решение на примере...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 30.12.2016, 22:30
Сообщение #7


Профессионал
*****

Группа: Модератор
Сообщений: 1628
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 226 раз(а)




Репутация:   12  


нет, разжёвывать у меня нет времени. я написала предельно точно. ничего сложного там нет. абстрактные классы, интерфейсы, наследование -> гугл. полезно самому учиться думать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
KuvshinoF
  опции профиля:
сообщение 17.1.2017, 22:34
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


ну с ДВУМЯ интерфейсами я вроде разобралась...а как можно их функционал (для одних классов-наследников методы чтения и записи неких данных доступны, для других - доступны только методы чтения данных) реализовать в ОДНОМ классе (интерфейсе)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 18.1.2017, 9:39
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 880
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 136 раз(а)




Репутация:   8  


Цитата
connect передавать данные не хотелось бы, так как таких передач достаточно много и важно быстродействие...

Ложная предпосылка, если connect между классами в одном потоке, то он стоит лишь чуть больше вызова функции. Если в разных, то вам в любом случае пилить синхронизацию, а в connect она есть из коробки.
Connect очень, очень быстрый. Попробуйте через него и покажите бенчмарки при которых его не хватает, я их на стенку повешу :lol: А пока это сильно предварительная оптимизация.
Цитата
Вопрос: можно ли (если да, то подскажите пож-та на примере) сделать так, чтобы в классе В можно было бы пользоваться (компиляция без ошибок) методами и setValue, и getValue класса А,
а в классе С — ТОЛЬКО методом getValue?

Цитата
а как можно их функционал (для одних классов-наследников методы чтения и записи неких данных доступны, для других - доступны только методы чтения данных)

Раскрывающийся текст
#include <iostream>

class BaseValue {
    public:
        virtual ~BaseValue() {}
    protected:
        int iValue;
};

class Value : public BaseValue {
    public:
        int getValue() {return iValue;}
};

class MutableValue : public Value {
    public:
        void setValue(int v) {iValue=v;}
};

class Data : public MutableValue {};

class Reader {
    public:
        virtual int Read() = 0;
        virtual ~Reader() {}
};

class Writer {
    public:
        virtual void Write(int i) = 0;
        virtual ~Writer() {}
};

class Data2 : public Reader, public Writer {
    private:
        int iValue;
    public:
        virtual int Read() override { return iValue; }
        virtual void Write(int i) override { iValue = i; }
};

int main() {
    Data d;
    Data2 d2;

    {
        Value * readOnly = &d;
        MutableValue * readWrite = &d;

        readWrite->setValue(42);
        std::cout << "The answer is: " << readOnly->getValue() << std::endl;
    }
    {
        Reader * readOnly = &d2;
        Writer * writeOnly = &d2;

        writeOnly->Write(1);
        std::cout << "Test: " << readOnly->Read() << std::endl;
    }

    return 0;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.1.2017, 11:27