Использование переменной класса в качестве аргумента по умолчанию для функции-члена класса - PullRequest
1 голос
/ 07 августа 2020

Я создаю LinkedList на C ++. Подпись для addNode function:

const bool LinkedList::addNode(int val, unsigned int pos = getSize());  

getSize() - это publi c non-stati c функция-член:

int getSize() const { return size; }

size is non-stati c частная переменная-член. Однако я получаю сообщение об ошибке: a nonstatic member reference must be relative to a specific object

Как мне достичь этой функции?

Для справки, вот весь код:

#pragma once

class LinkedList {
    int size = 1;
    struct Node {
        int ivar = 0;
        Node* next = nullptr;
    };
    Node* rootNode = new Node();
    Node* createNode(int ivar);
public:
    LinkedList() = delete;
    LinkedList(int val) {
        rootNode->ivar = val;
    }
    decltype(size) getSize() const { return size; }
    const bool addNode(int val, unsigned int pos = getSize());
    const bool delNode(unsigned int pos);
    ~LinkedList() = default;
};


Некоторые другие попытки включают:

const bool addNode(int val, unsigned int pos = [=] { return getSize(); } ());
const bool addNode(int val, unsigned int pos = [=] { return this->getSize(); } ());
const bool addNode(int val, unsigned int pos = this-> getSize());

Текущее решение, которое я использую сейчас:

const bool LinkedList::addNode(int val, unsigned int pos = -1) {
    pos = pos == -1 ? getSize() : pos;
    //whatever
}

1 Ответ

4 голосов
/ 07 августа 2020

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

// when specifying pos
const bool LinkedList::addNode(int val, unsigned int pos) {
    pos = pos == -1 ? getSize() : pos;
    //whatever
}

// when not specifying pos, using getSize() instead
const bool LinkedList::addNode(int val) {
    return addNode(val, getSize());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...