используя авто/указатель на дочерний элемент, доступ к родительскому методу дочернего элемента

Я пытаюсь понять, как получить доступ к родительскому методу, используя указатель на дочерний класс. Есть идеи? Я искал примеры, но нашел вещи, которые скорее отличались, чем нет. дочерний родительский доступ - другой.

У меня есть тестовый класс со следующим:

auto canvasObj = parseCanvas(one, two);
Three l_three = CanvasObject::ParentOfCanvas->getThree(); //this isn't working
//I also tried l_three = canvasObj->getThree(); (doesn't work)

куда:

class CanvasObject final : public ParentOfCanvas
{....}

а также:

class ParentOfCanvas : public AnotherObject
{
public:
     Three getThree();
       ...
}

person Michele    schedule 10.03.2015    source источник
comment
Что значит не работает? Не компилируется?   -  person Mustafa Ozturk    schedule 10.03.2015
comment
Компилятор говорит, что у AnotherObject нет члена getThree(); Это использование canvasObj-›getThree();   -  person Michele    schedule 10.03.2015
comment
Вопрос, который вы связываете, противоположен.   -  person Neil Kirk    schedule 10.03.2015
comment
@ Альфи Дж. Палмер, ваше редактирование ухудшает форматирование вопроса.   -  person Neil Kirk    schedule 10.03.2015
comment
canvasObj->getThree() должно работать   -  person Mustafa Ozturk    schedule 10.03.2015
comment
Я знаю, что ссылка другая. Я не мог найти такой же пример.   -  person Michele    schedule 10.03.2015
comment
что возвращает parseCanvas()?   -  person Paul Evans    schedule 10.03.2015
comment
parseCanvas возвращает unique_ptr‹AnotherObject›   -  person Michele    schedule 10.03.2015
comment
Это ваша проблема прямо там. AnotherObject не определяет getThree   -  person Mustafa Ozturk    schedule 10.03.2015
comment
Я знаю, но, похоже, я не говорю ему искать метод в AnotherObject. Вы видите проблему с моим синтаксисом? Что ты посоветуешь?   -  person Michele    schedule 10.03.2015
comment
@NeilKirk Это была ошибка; Я обновил страницу, прежде чем Мишель обновил ее во второй раз. Извинения.   -  person Alfie J. Palmer    schedule 10.03.2015
comment
@ Мишель, дизайн твоих классов кажется очень плохим. parseCanvas должна быть функцией, связанной с объектом Canvas, и должна возвращать объект Canvas. Когда parseCanvas когда-либо вернет что-то, что не является холстом?   -  person Mustafa Ozturk    schedule 10.03.2015
comment
Это кажется странным. AnotherObject настроен как объект Java, поэтому он является родителем почти всего. Я не уверен, почему они это делают, но пока это работает.   -  person Michele    schedule 10.03.2015
comment
Спасибо за помощь, ребята. Я не знал, что canvasObject имеет тип AnotherObject. Я сделал это, и это работает: base_static_cast‹AnotherObject, Three›(canvasObject)-›getThree();   -  person Michele    schedule 10.03.2015


Ответы (3)


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

Вместо :

auto canvasObj = parseCanvas(one, two); 
Three l_three = CanvasObject::ParentOfCanvas->getThree(); //this isn't working

Использовать :

auto canvasObj = parseCanvas(one, two);
Three l_three = canvasObj.getThree(); // or maybe canvasObj->getThree()

Причина, по которой ваша не сработала, заключается в том, что это своего рода путаница при попытке доступа к «статической» функции-члену вместо одной в конкретном экземпляре. В моем решении я получаю доступ к данным getThree в объекте холста, который вы создали из возврата parseCanvas.

С другой стороны, если мое решение не работает, возможно, parseCanvas возвращает неправильный тип данных. То есть я ожидаю, что он вернет CanvasObject, но вы не указали подпись для этого метода. Возможно, вам придется привести или заменить auto именно тем типом, который вам нужен (CanvasObject*). Возможно, что parseCanvas может возвращать тип const, а getThree не помечен как const, поэтому у вас возникнут проблемы с его вызовом.

Возможно, если бы вы указали точную ошибку компилятора, мы могли бы сузить ее еще больше.

РЕДАКТИРОВАТЬ:

Судя по вашим комментариям, объекту холста возвращается дополнительный указатель базового класса, и вы пытаетесь вызвать метод производного класса. Этого нельзя делать. Вам нужно настроить свой метод parseCanvas, чтобы он возвращал указатель производного класса, или вам нужно (ОЧЕНЬ ПЛОХАЯ ИДЕЯ) перевести указатель из базового класса в производный (если вы действительно знаете, что это действительно такой тип).

person LawfulEvil    schedule 10.03.2015

Вам нужно использовать объектную переменную примерно так:

Three l_three = canvasObj->getThree();
person Paul Evans    schedule 10.03.2015
comment
canvasObj в данном случае — это unique_ptr‹AnotherObject›, который понятия не имеет, что такое getThree. - person Mustafa Ozturk; 10.03.2015

Я сделал это, и он работает:

base_static_cast<AnotherObject, Three>(canvasObject)->getThree();

Коррекция. После дальнейшего тестирования мне пришлось сделать это:

static_cast(canvasobject.get())->getThree();

Он пытался получить информацию из неправильного места.

person Michele    schedule 10.03.2015
comment
Вам действительно нужно исправить свой дизайн, если ваши базовые классы должны вызывать методы производных классов. Однако, если вы застряли с плохим дизайном, вам следует использовать динамическое приведение для выполнения приведения вниз, а не статическое приведение, и всегда проверять возвращаемое значение, поскольку неудачное приведение вниз вернет нулевой указатель, поэтому не разыменовывайте его сразу. msdn.microsoft.com/en-us/library/cby9kycs.aspx - person LawfulEvil; 11.03.2015