Russian Qt Forum
Ноябрь 22, 2024, 18:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Incomplete type  (Прочитано 12439 раз)
AzazelloAV
Гость
« : Октябрь 02, 2016, 16:07 »

Заблудился в 3-х соснах.
Подстажите как выбраться из ситуации:

class Test {
   Test mTest; << Incomplete type
}
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Октябрь 02, 2016, 16:10 »

Подстажите как выбраться из ситуации:
Никак. Вы не можете хранить объект не до конца описанного класса.
Вместо хранения самого объекта по значению, можно хранить ссылку/указатель на него.
Записан
AzazelloAV
Гость
« Ответ #2 : Октябрь 02, 2016, 16:26 »

Подстажите как выбраться из ситуации:
Никак. Вы не можете хранить объект не до конца описанного класса.
Вместо хранения самого объекта по значению, можно хранить ссылку/указатель на него.

Спасибо. Прийдется городить, думал есть какое-то шаблонное решение.
Хотя, теоретически, он бы мог (компилятор) два раза по классу пробежаться.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #3 : Октябрь 03, 2016, 10:03 »

Это же бред  Шокированный. Так бы получилась бесконечная вложенность. Не может тип агрегировать сам себя, может только ассоциировать через указатель или ссылку.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Октябрь 03, 2016, 10:13 »

Хотя, теоретически, он бы мог (компилятор) два раза по классу пробежаться.
Допустим. Какого размера будет тогда экземпляр такого класса?
Записан
AzazelloAV
Гость
« Ответ #5 : Октябрь 03, 2016, 17:33 »

Хотя, теоретически, он бы мог (компилятор) два раза по классу пробежаться.
Допустим. Какого размера будет тогда экземпляр такого класса?

Точно такого же. А что вас удивляет? Почему на одну единицу трансляции он два раза не может пробежаться по заголовку? Первый раз пропустил неопределенные типы, второй раз дополнил их (не говорите про рекурсию и что он будет "пухнуть" до бесконечности). Я конечно не могу сказать, что так заработает, могу предположить. А откуда предположения? В своё время при программировании на ассемблере как раз два прохода и делали, если какие либо данные не могли взяться с первого.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Октябрь 03, 2016, 17:38 »

не говорите про рекурсию
Только это и остаётся говорить Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Октябрь 03, 2016, 17:41 »

Как уже написал выше Old, храните ссылку/указатель на класс этого типа. Тут компилятор чётко выделит количество памяти равное размеру регистра под хранение этого объекта.
Записан
AzazelloAV
Гость
« Ответ #8 : Октябрь 03, 2016, 17:42 »

не говорите про рекурсию
Только это и остаётся говорить Улыбающийся
Я сделал акцент на этом, потому как "размер" объекта можно высчитать, хотя со стороны это выглядит как рекурсия.
Записан
AzazelloAV
Гость
« Ответ #9 : Октябрь 03, 2016, 17:44 »

Как уже написал выше Old, храните ссылку/указатель на класс этого типа. Тут компилятор чётко выделит количество памяти равное размеру регистра под хранение этого объекта.

А как же смарт поинтеры? Опять враперы. Врапер врапером погоняет...
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Октябрь 03, 2016, 17:48 »

Можете и смартпоинтеры использовать, тот же указатель получите. Только не забудьте деструктор сделать внешним в таком случае а также предварительное объявление класса.
Записан
AzazelloAV
Гость
« Ответ #11 : Октябрь 03, 2016, 17:50 »

Можете и смартпоинтеры использовать, тот же указатель получите. Только не забудьте деструктор сделать внешним в таком случае а также предварительное объявление класса.

Привидите пример вышеупомянутого класса с *mTest полем, который является смартпоинтером
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Октябрь 03, 2016, 17:57 »

Код
C++ (Qt)
#include <iostream>
#include <memory>
 
class Test;
class Test {
public:
   ~Test();
private:
   std::unique_ptr<Test> mTest;
};
 
Test::~Test() = default;
 
int main() {
   std::cout << sizeof (Test) << '\n';
   return 0;
}
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #13 : Октябрь 03, 2016, 18:00 »

Я сделал акцент на этом, потому как "размер" объекта можно высчитать, хотя со стороны это выглядит как рекурсия.
Не совсем понятно. Размер вы не высчитаете из-за этой самой вложенности.
Записан
AzazelloAV
Гость
« Ответ #14 : Октябрь 03, 2016, 18:02 »

   std::unique_ptr<Test> mTest;

Чет я не понял. Как вы можете объявлять переменную цитата: "не до конца описанного класса".
Или другими словами, чем отличается      std::unique_ptr<Test> mTest от просто Test mTest

Я сделал акцент на этом, потому как "размер" объекта можно высчитать, хотя со стороны это выглядит как рекурсия.
Не совсем понятно. Размер вы не высчитаете из-за этой самой вложенности.

"Размер" объекта без вложености Х (Давайте считать слово "размер", как хеш противоречий.). Неужели если он зная свой "размер" без неопределенностей,  не может его приплюсовать туда же?
« Последнее редактирование: Октябрь 03, 2016, 18:08 от AzazelloAV » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.111 секунд. Запросов: 22.