crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Ошибка компилера или нет ?, Поясните плз ...
JohnZ
  опции профиля:
сообщение 14.2.2017, 14:57
Сообщение #1


Участник
**

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

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




Репутация:   0  


Есть созданный класс С++

class fpForma : public QDialog
{
    Q_OBJECT

public:

    Q_INVOKABLE fpForma(int id, MainWindow *parent = 0, Qt::WindowFlags f = 0);

public slots:

protected slots:

    void on_buttonPress();

private:

    fpTableModel       *model;    
    fpForma           *formChild;    // Форма редактирования записи
};


... и есть в этом классе ф-ция, где пишем ...

bool fpForma::init()
{
      ........................................

        formChild = new fpForma(item, Parent);       // "Рекурсивный" вызов !!!

        if (!isFlags->testBit(isExtModel))              // Модель не внешняя
        {
           ........................................
            formChild->model = model;        // Установка Модели из вне ...   ?????????????
        }

      ........................................


По идее компилер должен был-бы ругнуться на доступ к private, а вотЪ не ругается !!!

пАчЭму ???

(Raspberry Pi 2, Debian)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 14.2.2017, 17:48
Сообщение #2


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

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

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




Репутация:   9  


private защищает на уровне классов, из любого экземпляра можно достучаться к приватным членам любого другого экземпляра.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 14.2.2017, 19:07
Сообщение #3


Участник
**

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

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




Репутация:   0  


Т.е. любой к примеру QLineEdit на форме может напрямую поменять содержимое любого другого QLineEdit-а ?
Это-же не совсем правильно, по ++ ?!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 14.2.2017, 21:34
Сообщение #4


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

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

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




Репутация:   9  


Цитата
Т.е. любой к примеру QLineEdit на форме может напрямую поменять содержимое любого другого QLineEdit-а ?

Он и так может, у него же есть метод setText :lol:

Цитата
Это-же не совсем правильно, по ++ ?!

В c++ так себе ООП, так что ничего страшного ;)
Компилятор просто никак не может проверить что доступ происходит из другого экземпляра, например:
void A::test(A * other) {
A * a = (rand() %2) ? this : other;
a->privateMethod(); // << компилировать или нет?
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.2.2017, 6:23
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9687
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(JohnZ @ 14.2.2017, 21:07) *
Т.е. любой к примеру QLineEdit на форме может напрямую поменять содержимое любого другого QLineEdit-а ?
Если ты умудришся ему передать указатель на себе подобного, и конечно нужен будет код (которого в QLineEdit нет), чтобы он менял что-то в чужом QLineEdit.

Эта особенность позволяет создавать конструкторы копирования, т.е. внутри него THIS может обращаться к полям OTHER.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 15.2.2017, 9:18
Сообщение #6


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

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

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




Репутация:   9  


Цитата
Эта особенность позволяет создавать конструкторы копирования, т.е. внутри него THIS может обращаться к полям OTHER.

Это скорее её так используют, но можно создать конструктор копирования и без этого. Причина же в том, что на этапе компиляции можно следить только за типом объекта, но не за конкретным экземпляром.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 15.2.2017, 16:27
Сообщение #7


Участник
**

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

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




Репутация:   0  


Понятно. БлагоДарю !!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 29.3.2017, 2:18