LINUX.ORG.RU

Вызов метода из метода. C++

 ,


0

1

Возможно не совсем правильно назвал тему, но что-то ничего другого на ум не приходит.

Вообщем мне нужно сделать примерно след-е:

    myObj *dan = new myObj();
    dan->addAttribut("a").addAttribut("b");

вопрос в следующем: как теперь внутри метода addAttribut() узнать, что параметр «b» именно на второй ступени иерархии?

Пример:

     dan->addAttribut("a").addAttribut("b").addAttribut("c");
     dan->addAttribut("a").addAttribut("b");
     
     result:

        danArray[a][b][c];
        danArray[a][b];



Последнее исправление: CYB3R (всего исправлений: 1)

вызывайте телепатов. А Qt тут где?

Blastbit
()

addAttribute должен возвращать не myObj&, а прокси объект, который уже и будет знать про ступени иерархии.

Begemoth ★★★★★
()

proxy1 dan::addAttr(const char*);

proxy2 proxy1::addAttr(const char*);

proxy3 proxy2::addAttr(const char*);

proxy1 должен приводиться к типу danArray[a]

proxy2 должен приводиться к типу danArray[a]

anonymous
()

dan->addAttribut("a").addAttribut("b"); вопрос в следующем: как теперь внутри метода addAttribut() узнать, что параметр «b» именно на второй ступени иерархии?

dan->addAttribut("a") должно иметь какой-то особый тип «вторая ступень иерархии». Возможно это будет наследник первой ступени, или наоборот или это будет другой наследник абстрактного базового класса «иерархия».

emulek
()
Ответ на: комментарий от jeka_sharapov
#include <string>
#include <vector>

struct MyObj1 {

    std::vector<std::string> attrs;

    MyObj1& addAttr(std::string const& attr) {
        attrs.push_back(attr);
        return *this;
    }

};

struct MyObj2 {

    std::vector<MyObj1> attrs;

    MyObj1& addAttr(std::string const& attr) {
        attrs.push_back(MyObj1().addAttr(attr));
        return attrs.back();
    }

};

int main() {

    MyObj2 dan;
    dan.addAttr("a").addAttr("b").addAttr("c");
    dan.addAttr("a").addAttr("b");
    dan.addAttr("a").addAttr("b").addAttr("c").addAttr("d");

    for (auto const& attrs1 : dan.attrs) {
        for (auto const& attr : attrs1.attrs)
            printf("%s ", attr.c_str());
        puts("");
    }

}
quasimoto ★★★★
()
myObj myObj::addAttribut(QString index, QString dan) {
    QMap<QString, QVariant> chaild;
    chaild["one"] = dan;
    chaild["two"] = dan;

    //вот тут надобы определить ступень
    //и произвести вложение в иерархию.
    container[index] = chaild;

    return *this;
}

В QString есть метод arg() который работает наподобие, как реализовать это?

jeka_sharapov
() автор топика
Ответ на: комментарий от yoghurt

Хотя, там поступили несколько иначе:

Returns a copy of this string with the lowest numbered place marker replaced by string a, i.e., %1, %2, ..., %99.

yoghurt ★★★★★
()

что параметр «b» именно на второй ступени иерархии?

ЯННП. А зачем это знать?

no-such-file ★★★★★
()
Ответ на: комментарий от Begemoth

а прокси объект, который уже и будет знать про ступени иерархии.

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

no-such-file ★★★★★
()
Ответ на: комментарий от jeka_sharapov

В QString есть метод arg() который работает наподобие

Он работает не так. Там всё проще, при вызове arg происходит замена шаблона %1->arg, %2->%1, %3->%2 и т.д. Ничего о последующих вызовах arg знать не нужно.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Проблема не в этом, а в том, что нужно определить последний вызов в такой цепочке и применить накопленный результат

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

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Применить - в деструкторе прокси

Деструктор временного объекта может быть вызван не сразу. Да и вообще это то, что называется «сделано через жопу».

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Я вообще не понимаю, зачем нужно так выеживаться. Почему нельзя сделать просто и понятно:

dаn->applyAttrs(makeAttrs().addAttr(«a»).addAttr(«b»));

Что гораздо лучше, т.к. атрибуты можно обрабатывать отдельно, запоминать для применения к разным объектам и т.п.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

Может ввести прокси класс таким образом

template <class Base>

class dan : public Base {

public:

typedef dan<Base> This;

dan<This> addAttribute ( const char * ) const;

}

anonymous
()
Ответ на: комментарий от no-such-file

Деструктор временного объекта может быть вызван не сразу

Не сразу если этот объект является подвыражением чего-то большего, в этом случае могут помочь неявные преобразования типов.

Begemoth ★★★★★
()
Ответ на: комментарий от no-such-file

Почему нельзя сделать просто и понятно:

Кстати, можно сделать ещё проще - передать в applyAttrs std::initilization_list<const char*>.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Кстати, можно сделать ещё проще - передать в applyAttrs std::initilization_list<const char*>.

Это немножко похуже, т.к. нельзя работать с атрибутами отдельно.

Не сразу если этот объект является подвыражением чего-то большего

Ага, если ТС захочет написать if (dan->addAttribut(«a»).addAttribut(«b»)) {...} то будет ещё одна тема на ЛОРе - почему не работает.

no-such-file ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.