Как реализовать перегруженный оператор стрелки для реализации PImplC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как реализовать перегруженный оператор стрелки для реализации PImpl

Сообщение Anonymous »

Я изучаю PImpl, используя следующий MyClass. В основной функции я использую этот класс. Я получаю ошибку компиляции, когда пытаюсь использовать перегруженную функцию оператора стрелки. IntelliSense в Visual Studio предполагает, что указатель на неполный тип класса недопустим, и я приложил снимок экрана с точной ошибкой компилятора. Было бы здорово узнать, в чем именно здесь проблема и как именно реализовать в этом случае перегруженный оператор стрелки.

Код: Выделить всё

// myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H

#include 

class MyClass {
public:
MyClass(int number);
MyClass(const MyClass& other);
MyClass& operator=(MyClass rhs);
~MyClass();

int getNumber();
void setNumber(int number);

struct Impl;

private:
std::unique_ptr pimpl;
Impl* operator->();
};

#endif // MYCLASS_H

Код: Выделить всё

// myclass.cpp
#include "myclass.h"

struct MyClass::Impl {
Impl(int number) : m_data{ number } {}

int m_data;
};

MyClass::MyClass(int number) : pimpl{ new Impl(number) } {}

MyClass::MyClass(const MyClass& other) : pimpl{ new Impl(*other.pimpl) } {}

MyClass& MyClass::operator=(MyClass rhs) {
std::swap(pimpl, rhs.pimpl);
return *this;
}

MyClass::~MyClass() = default;

MyClass::Impl* MyClass::operator->()
{
return pimpl.get();
}

int MyClass::getNumber() {
return pimpl->m_data;
}

void MyClass::setNumber(int number) {
pimpl->m_data = number;
}

Код: Выделить всё

#include "myclass.h"
#include 

int main()
{
MyClass obj1{ 10 };
MyClass obj2{ 200 };
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78708432/how-to-implement-an-overloaded-arrow-operator-for-a-pimpl-implementation[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»