2013-07-16 3 views
0

Я пытаюсь добиться вызова класса, чтобы получить параметры по умолчанию для другой функции-члена того же класса. Вот что я делаю:вызов члена класса для получения параметров по умолчанию для другой функции-члена того же класса

class y { 
    virtual vector<int> getLabels(); 
} 

class x: public y { 
    virtual vector<int> getLabels(); 
    listGraph getPlanarGraph(const vector<int> &nodeSe=getLabels()); //want to achieve this. Compiler won't agree 
}; 

Если ничего не предусмотрено т.е. называется obj.getPlanarGraph() где obj имеет соответствующего типа, то я хочу, чтобы получить список всех набора меток в . Я знаю, что могу написать простую упаковку для этого, например, следующую (см. Конец), но меня больше интересует , почему не разрешено. Для вышеприведенной декларации ошибка компиляции: cannot call member function ‘virtual std::vector<int> baseGraph::getLabels() const’ without object.

Когда я предоставляю аргумент this, тогда ошибка ‘this’ may not be used in this context.

class x: public y { 
    virtual vector<int> getLabels(); 
    listGraph getPlanarGraph(const vector<int> &nodeSe=this->getLabels()); //error here. 
}; 

Обходной я думаю это:

class x: public y { 
    virtual vector<int> getLabels(); 
    listGraph getPlanarGraph(const vector<int> &nodeSet); //No. 2 
    listGraph getPlanarGraph(); //define the function accordingly and call a 'No. 2' from inside. 
}; 
+0

Это невозможно - обходной вариант - это только вариант. –

+0

@IwanAucamp в порядке. Но почему это невозможно. С какими проблемами можно столкнуться, если разрешен такой тип настройки –

+0

в соответствии с C++ 03/[class.this]/1; 'this' определяется только в нестационарном элементе функции-члена, и в противном случае член может не использоваться без объекта, поэтому, поскольку нет способа ссылаться на ваш объект в объявлении функции, здесь нет реальной возможности (по крайней мере - ни о чем я не могу думать). –

ответ

0
listGraph getPlanarGraph(const vector<int> &nodeSe=this->getLabels());  

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

Относительно того, почему это не возможно, линия выше несколько похожа на вызов метода, как это:

x xinstance; 
const vector<int> nodeSe labels = this->getLabels(); 
listGraph lg = xinstance.getPlanarGraph(labels); 

Этот код будет работать, но вы можете ясно видеть, что this относится к экземпляру любой класс содержит строки кода выше, а не xinstance. Однако, как отметил @Ivan Aucamp в комментариях, когда он выражается в объявлении функции-члена, this не ссылается ни на что, потому что он не определен в этой точке.

+0

Фактически в 'listGraph getPlanarGraph (const vector & nodeSe = this-> getLabels());', 'this' не ссылается ни на что, поскольку в этом контексте нет смысла. См. C++ 03/[class.this]/1 –

+0

@IwanAucamp: Я согласен с тем, что я этого не делал. Я отредактирую свой ответ, чтобы уточнить. – Simon

 Смежные вопросы

  • Нет связанных вопросов^_^