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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Программирование / С/C++ / Почему RWO не вызывается при operator* указателя? : Август 04, 2022, 15:28
Здравствуйте. Оператор уникального указателя operator* при возвращении объекта для которого указатель был создан возвращает копию объекта а должен вроде ссылку?

Например:
Я создал указатель для объекта: unique_ptr<MyObect> my_pointer(new MyObect ());
Далее получаю ссылку на сам класс MyObect с помощью указателя my_pointer:
MyObect obect = *my_pointer – и вот здесь почему то не вызывается rwo а вызывается конструктор копирования класса MyObect а мне нужно получить саму ссылку. В классе unique_ptr есть переопределенный оператор * - этот оператор ведь должен возвращать ссылку на объект без вызова всяких конструкторов копирования? Но почему то возвращает именно копию.

Я для примера создал свой класс уникального указателя вот его код:
template <typename T>
class smart_pointer
{
private:
T* rawPtr;
public:
smart_pointer(T* pData) : rawPtr(pData) {}
~smart_pointer() { delete rawPtr; };

T& operator* () const
{
return *(rawPtr);
}

T* operator-> () const
{
return rawPtr;
}
};
Здесь обратите внимание на T& operator* - все условия для вызова RWO есть: одна инструкция, нужный тип в итоге должно сработать rwo и вернуться сама ссылка но нет тоже как и в unique_ptr вызывается конструктор копирования.
2  Программирование / С/C++ / Re: Не совсем понятно зачем нужна функция remove_reference? : Июль 23, 2022, 01:28
Вопрос решен: int i_t_3 = static_cast<typename std::remove_reference<decltype(i_temp)>::type>(i_temp) - remove_reference преобразует только тип а я думал полностью возвращает переменную
3  Программирование / С/C++ / Не совсем понятно зачем нужна функция remove_reference? : Июль 22, 2022, 23:18
Здравствуйте, не совсем понятно зачем нужна функция remove_reference? В описание написано std::remove_reference<> - превращает ссылочный тип в соответствующий нессылочный (типовой член шаблона type). Как я понимаю удаляет все ссылки из переменной и приводит ее к обычному (первоначальному) типу то есть если одна переменная ссылается на другую тогда выражение  std::remove_reference должно удалить в ней эти ссылки - но однако так не получается
вот пример кода:

int i = 5;
int& i_t = i;
std::remove_reference<decltype(i_t)>::type;
i_t = 9;
cout << i << endl; // - ЗДЕСЬ ПОСЛЕ ПРИМЕНЕНИЯ remove_reference ПЕРЕМЕННАЯ i_t ВСЕ РАВНО ССЫЛАЕТСЯ НА ПЕРЕМЕННУЮ i.

И еще два примера кода (один рабочий,  другой нет) :

Рабочий код (переменная int&& преобразовывается к типу int)
std::cout << std::is_same<int, std::remove_reference<int&&>::type>::value << '\n';

Не рабочий код (переменная int&& не преобразовывается по чему то к типу int):
int &&i_temp = 8;
std::remove_reference<decltype(i_temp)>::type;
std::cout << std::is_same<int, decltype(i_temp)>::value << '\n'; // - В этом коде переменная как была временной так и осталось, типом int не стало. И вообще не
//понятно куда сохранить результаты вызова remove_reference? На пример если по пробовать сохранить так:  auto i_temp_2 = std::remove_reference<decltype(i_temp)>::type; -  такая инструкция вызывает ошибку компиляции.
4  Программирование / С/C++ / Re: есть в С++ стандартная функция проверки валидности указателя? : Июнь 27, 2022, 14:34
спасибо
5  Программирование / С/C++ / есть в С++ стандартная функция проверки валидности указателя? : Июнь 27, 2022, 01:00
Здравствуйте. Помогите новичку с проверкой указателя перед удалением.
Недавно начал заниматься с++ и такая проблема:
Создал простой класс он содержит указатель char* buffer, конструктор и деструктор, и больше не чего вот его код: 
class MyStringDefaultCopy
{
 
private:
    char* buffer;
MyStringDefaultCopy(const char* initString) // Constructor
    {
       buffer = new char[strlen(initString) + 1];
       strcpy(buffer, initString); 
    }

~MyStringDefaultCopy() // Destructor
    {
        delete[] buffer;
        *buffer = NULL;     
    }
}
Создал одну простую функцию:
void UseMyString(MyStringDefaultCopy str)
{
    cout << "вызов функции UseMyString  " << endl;
}
Код Main простой состоит из двух строк:
MyStringDefaultCopy sayHello("Hello");
UseMyString(sayHello);
ПРОБЛЕМА: Код Main отрабатывает но по завершении программы выдает ошибку _CrtIsValidHeapPointer. Я знаю из за чего возникает эта ошибка: проблема вот в чем в коде Main при вызове функции UseMyString передается копия объекта sayHello, которая соответственно в конце функции уничтожается. Так как у объекта sayHello есть указатель и деструктор но нет копирующего конструктора, по этому при создании копии для функции UseMyString используется копирующий конструктор по умолчанию который просто скопирует все указатели в классе, соответственно после выполнения функции UseMyString удаляется копия MyStringDefaultCopy str и вызывается деструктор который делает указатель buffer неопределенным. При окончании Main удаляется уже основной объект sayHello и вызывается его деструктор который указатель buffer уже удалить не может так как он не определен. Собственно вопрос есть метод проверки валидности указателя перед его удалением: типа *buffer = NULL – не помогает. Можно присвоить после удаления указателю значение, например *buffer = “удален” и перед удалением сравнивать на это значение но может есть стандартная функция проверки валидности указателя?   
6  Qt / Вопросы новичков / Вопрос про определение оператора = в классе. Спецы должны знать. : Декабрь 23, 2020, 09:00
Всем привет. Я в с++ новичок столкнулся тут с проблемой: Не работает определения оператора присвоения (=) в классе. Пишет кучу ошибок синтаксиса скобок и тд.
Если весь класс в одном файле проблем нет но если разделить класс на h и cpp - не хочет компилироваться. Час уже убил. Кто знает что не так. Вот пример кода:
Файл h:
class ZapretCopyConst
{

public:
std::string name;
ZapretCopyConst(std::string name);
ZapretCopyConst& operator = (const ZapretCopyConst& copySrc); //в h все нормально не хочет в cpp
void GetMessage();
};

Файл cpp :

ZapretCopyConst::ZapretCopyConst(std::string m_name)
{
   name = m_name;
}

void ZapretCopyConst::GetMessage()
{
   std::cout << name << std::endl;
}


//Что здесь не так НепонимающийНепонимающий
ZapretCopyConst& = (const ZapretCopyConst& copySrc) // При компоновке пишет ошибка синтаксиса
{
   
    return *this;
}

7  Qt / Вопросы новичков / qt - возможно бесплатная версия : Февраль 26, 2020, 23:11
Я новичок в qt.  Зашел на их сайт qt.io скачал естественно триальную. Как я понимаю она будет работать 30 дней. Не ужели нет бесплатной версии. Раньше ведь по мойму была с ограниченными возможностями?
Страниц: [1]

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