я следующий класс третьей стороной (просто обертка вокруг какой-то указатель):Скрыть сведения о реализации через внутренний указатель
// a.h
class AImpl;
class A
{
AImpl* pImpl;
public:
A(): pImpl(0) {}
A(AImpl* ptr): pImpl(ptr) {}
...
AImpl* getImpl() const { return pImpl; }
...
void someMethodOfA();
};
Я хочу изменить интерфейс A
«s: отключить некоторые методы, добавить некоторые новые, скрывая его детали реализации. Я решил сделать следующее:
// new_a.h
class AImpl;
class A;
class NewA
{
AImpl* pImpl;
public:
NewA(const A& a);
...
void newMethodOfA();
...
};
//new_a.cpp
#include "a.h"
NewA::NewA(const A& a): pImpl(a.getImpl()) {}
...
void NewA::newMethodOfA()
{
A(pImpl).someMethodOfA();
}
...
В порядке ли это так? Может быть, есть лучшее решение? Я хочу изменить интерфейс A
, потому что он не соответствует моим потребностям и не хочет хранить его в моем собственном коде.
Важно, если «A» имеет виртуальные функции-члены, в этом случае вы можете получить из A и создать свой собственный набор функций-членов и, если необходимо, вызвать некоторых из базового класса. – CyberGuy
@CyberGuy Нет, 'A' не имеет виртуальных функций. Он не был предназначен для полиморфности. – user2547823
Какую реализацию вы пытаетесь скрыть ?. Ваш 'pImpl' является фактически' public'. –