Russian Qt Forum

Программирование => С/C++ => Тема начата: AzazelloAV от Октябрь 02, 2016, 16:07



Название: Incomplete type
Отправлено: AzazelloAV от Октябрь 02, 2016, 16:07
Заблудился в 3-х соснах.
Подстажите как выбраться из ситуации:

class Test {
   Test mTest; << Incomplete type
}


Название: Re: Incomplete type
Отправлено: Old от Октябрь 02, 2016, 16:10
Подстажите как выбраться из ситуации:
Никак. Вы не можете хранить объект не до конца описанного класса.
Вместо хранения самого объекта по значению, можно хранить ссылку/указатель на него.


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

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


Название: Re: Incomplete type
Отправлено: ssoft от Октябрь 03, 2016, 10:03
Это же бред  :o. Так бы получилась бесконечная вложенность. Не может тип агрегировать сам себя, может только ассоциировать через указатель или ссылку.


Название: Re: Incomplete type
Отправлено: __Heaven__ от Октябрь 03, 2016, 10:13
Хотя, теоретически, он бы мог (компилятор) два раза по классу пробежаться.
Допустим. Какого размера будет тогда экземпляр такого класса?


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 17:33
Хотя, теоретически, он бы мог (компилятор) два раза по классу пробежаться.
Допустим. Какого размера будет тогда экземпляр такого класса?

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


Название: Re: Incomplete type
Отправлено: __Heaven__ от Октябрь 03, 2016, 17:38
не говорите про рекурсию
Только это и остаётся говорить :)


Название: Re: Incomplete type
Отправлено: __Heaven__ от Октябрь 03, 2016, 17:41
Как уже написал выше Old, храните ссылку/указатель на класс этого типа. Тут компилятор чётко выделит количество памяти равное размеру регистра под хранение этого объекта.


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 17:42
не говорите про рекурсию
Только это и остаётся говорить :)
Я сделал акцент на этом, потому как "размер" объекта можно высчитать, хотя со стороны это выглядит как рекурсия.


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 17:44
Как уже написал выше Old, храните ссылку/указатель на класс этого типа. Тут компилятор чётко выделит количество памяти равное размеру регистра под хранение этого объекта.

А как же смарт поинтеры? Опять враперы. Врапер врапером погоняет...


Название: Re: Incomplete type
Отправлено: __Heaven__ от Октябрь 03, 2016, 17:48
Можете и смартпоинтеры использовать, тот же указатель получите. Только не забудьте деструктор сделать внешним в таком случае а также предварительное объявление класса.


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 17:50
Можете и смартпоинтеры использовать, тот же указатель получите. Только не забудьте деструктор сделать внешним в таком случае а также предварительное объявление класса.

Привидите пример вышеупомянутого класса с *mTest полем, который является смартпоинтером


Название: Re: Incomplete type
Отправлено: __Heaven__ от Октябрь 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;
}
 


Название: Re: Incomplete type
Отправлено: __Heaven__ от Октябрь 03, 2016, 18:00
Я сделал акцент на этом, потому как "размер" объекта можно высчитать, хотя со стороны это выглядит как рекурсия.
Не совсем понятно. Размер вы не высчитаете из-за этой самой вложенности.


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 18:02
   std::unique_ptr<Test> mTest;

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

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

"Размер" объекта без вложености Х (Давайте считать слово "размер", как хеш противоречий.). Неужели если он зная свой "размер" без неопределенностей,  не может его приплюсовать туда же?


Название: Re: Incomplete type
Отправлено: Old от Октябрь 03, 2016, 18:27
чем отличается      std::unique_ptr<Test> mTest от просто Test mTest
Тем, что размер указателя всегда известен.

"Размер" объекта без вложености Х (Давайте считать слово "размер", как хеш противоречий.). Неужели если он зная свой "размер" без неопределенностей,  не может его приплюсовать туда же?
Давайте попробуем:
Код
C++ (Qt)
struct Test
{
   char m_data;    // sizeof(char) == 1
   Test m_test;    // sizeof(Test) == X
};
 

total = 1 + X
раскрываем X
total = 1 + (1 + X);
раскрываем X
total = 1 + (1 + ( 1 + X) );
раскрываем X...


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 18:45
Цитировать
чем отличается      std::unique_ptr<Test> mTest от просто Test mTest

Тем, что размер указателя всегда известен.

Т.Е. в std::unique_ptr<Test> mTest слово Test является указателем? Да не был никогда мой mTest объектом, он был указателем, пока я не захотел сделать его "умным". В Вашем примере будет такой же incomplete type

Давайте попробуем:
Код
C++ (Qt)
struct Test
{
   char m_data;    // sizeof(char) == 1
   Test m_test;    // sizeof(Test) == X
};
 


Цитировать
total = 1 + X
раскрываем X
total = 1 + (1 + X);
раскрываем X
total = 1 + (1 + ( 1 + X) );
раскрываем X...


Это софизм. С таким же успехом вы можете показать любому математику, не знакомого с программированием, выражение x=x+1. И ОН! ВАМ! скажет, что это бред. А чем не рекурсия?

В Вашем примере:

total = 1 +x;
Вычислили x первым проходом (без самого х).
total = 1 + x +x (как то так, а то у меня у самого может начатся рекурсия головного мозга)



Название: Re: Incomplete type
Отправлено: Bepec от Октябрь 03, 2016, 18:57
Вам уже ответили - это приведет к сотням проблем.

То, что вы зовете софизмом, мы называет бесконечным циклом.


Название: Re: Incomplete type
Отправлено: __Heaven__ от Октябрь 03, 2016, 19:06
вы можете показать любому математику, не знакомого с программированием, выражение x=x+1. И ОН! ВАМ! скажет, что это бред
Он скажет корней нет ;)


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 19:06
Вам уже ответили - это приведет к сотням проблем.

То, что вы зовете софизмом, мы называет бесконечным циклом.

Всё, ну его в баню. Закрываю тему, а то ерудна какая то.
Что хотел:

Первоначальный класс

class Test {
     Test *mTest
}

Стало необходимо:

class Test {
       QSharedPointer<Test> mTest;
}

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

Всем спасибо.

Спасибо сказал.

Всем.


Название: Re: Incomplete type
Отправлено: __Heaven__ от Октябрь 03, 2016, 19:12
и в моём примере сайзоф умного указателя будет равен 4 для x86 платформы.
замените unique на свой уу


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 19:12
и в моём примере сайзоф умного указателя будет равен 4 для x86 платформы.
замените unique на свой уу

Ваш пример тупо не компилируется.


Название: Re: Incomplete type
Отправлено: Hellraiser от Октябрь 03, 2016, 19:16
Цитировать
Всё, ну его в баню. Закрываю тему, а то ерудна какая то.
Что хотел:

Первоначальный класс

class Test {
     Test *mTest
}
Так и надо было сразу писать, тогда все тривиально:
Код
C++ (Qt)
class Test;
class Test {
    Test *mTest;
}


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 19:21
Цитировать
Всё, ну его в баню. Закрываю тему, а то ерудна какая то.
Что хотел:

Первоначальный класс

class Test {
     Test *mTest
}
Так и надо было сразу писать, тогда все тривиально:
Код
C++ (Qt)
class Test;
class Test {
    Test *mTest;
}


Процитирую классика (Масяню): То ли все идиоты, то ли .... На этом мысль  останавливается.

Сделайте мне *mTest "умным" указателем.



Название: Re: Incomplete type
Отправлено: Old от Октябрь 03, 2016, 19:31
Сделайте мне *mTest "умным" указателем.
Пожалуйста:
Код
C++ (Qt)
#include <iostream>
#include <memory>
 
using namespace std;
 
struct Test
{
   unique_ptr<Test>    m_test;
};
 
int main(int argc, char *argv[])
{
   cout << "Hello World!" << endl;
   return 0;
}
 

или так

Код:
#include <iostream>
#include <QScopedPointer>

using namespace std;

struct Test
{
    QScopedPointer<Test>    m_test;
};

int main(int argc, char *argv[])
{
    cout << "Hello World!" << endl;
    return 0;
}

Эти проекты компилируются.


Название: Re: Incomplete type
Отправлено: Old от Октябрь 03, 2016, 19:33
Процитирую классика (Масяню): То ли все идиоты, то ли .... На этом мысль  останавливается.
Процитирую Шнурова: :)
"Ведь если в башне по.бень.
То что .бень,что не .бень."


Название: Re: Incomplete type
Отправлено: AzazelloAV от Октябрь 03, 2016, 19:46
Сделайте мне *mTest "умным" указателем.
Пожалуйста:
Код
C++ (Qt)
#include <iostream>
#include <memory>
 
using namespace std;
 
struct Test
{
   unique_ptr<Test>    m_test;
};
 
int main(int argc, char *argv[])
{
   cout << "Hello World!" << endl;
   return 0;
}
 

или так

Код:
#include <iostream>
#include <QScopedPointer>

using namespace std;

struct Test
{
    QScopedPointer<Test>    m_test;
};

int main(int argc, char *argv[])
{
    cout << "Hello World!" << endl;
    return 0;
}

Эти проекты компилируются.

Гм. Гм. Ну чтож. Признаю свою ошибку.
Действительно компилируются, хотя в моем случае это было не так, и я отнёс это на .... Какая разница на что... На голом примере есть факт, значит все остальное не важно. Извеняюсь, если морочил голову.


Название: Re: Incomplete type
Отправлено: _Bers от Октябрь 08, 2016, 18:37
не говорите про рекурсию
Только это и остаётся говорить :)
Я сделал акцент на этом, потому как "размер" объекта можно высчитать, хотя со стороны это выглядит как рекурсия.

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

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