Изменение функциональности класса

#c #class

Вопрос:

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

 class Object {
    // modify this
};

template <typename Object>
void test(){
    Object z, y(2);
    if (z.x() == y.y()){
        const Object x;
        if (x.y() == Object::z())
            return;
    }
}

int main(int argc, char** argv) {
    test<Object>();
    return 0;
}
 

Ничего нельзя изменить, только этот класс, поэтому код компилируется без ошибок. Я новичок в классах, и мне трудно понять, что именно я должен поместить в этот класс, чтобы он компилировался. Я думал, что мне нужно сделать два конструктора, один без параметров, а другой с одним параметром, затем те x() и y() функции, но я все еще получаю ошибки. Ну, я имею в виду, что я только что сделал это:

 class Object {
public:
    Object() {
        x1 = 2;
        y1 = 2;
    }
    Object(int a) {
        x1 = a;
        y1 = a;
    }
    int x() {
        return x1;
    }
    int y() {
        return y1;
    }
private:
    int x1;
    int y1;
};

template <typename Object>
void test() {
    Object z, y(2);
    if (z.x() == y.y()) {
        const Object x;
        if (x.y() == Object::z())
            return;
    }
}

int main(int argc, char** argv) {
    test<Object>();
    return 0;
}
 

Я был бы благодарен, если бы вы помогли мне понять, как это должно выглядеть..

Комментарии:

1. int x() const; исправит одну из ваших проблем, другая вызвана отсутствием статической функции под названием z

2. @АлессандроТеруцци: Вообще-то, int y() const; . именование сбивает с толку.

3. ну, я хотел предложить, чтобы они оба были постоянными 🙂

Ответ №1:

Попробуй это. Получилось несколько грязно (?). По-прежнему открыт для конструктивной критики:

 class Object {
    int foo;
public:
    // Both the default constructor and the one that takes an int
    Object(const int amp;i = 1) : foo(i) {} 
    // Member functions
    static int z() { return 1; }
    int x() { return 1; }
    int y() const { return 1; }
};
 

Что касается второго, попробуйте это:

 class Object { 
    int foo;
public: 
    struct X { // Nested class
        int y() { return 2; } // for y.x.y()
    };
    X x; // for the same

    // Both the default constructor and the one that takes an int
    Object(const int amp;i = 1) : foo(i) {}

    bool operator<(const Object amp;o) { return 1; } // for std::sort
    int operator()() { return 0; } // for x[0]()
    Object operator  (int) { return *this; } // for x[1]  
    int y() { return 2; } // for x[1]  y.() 
}; 
 

Обратите внимание на использование вложенного класса. Как и в случае с первым заданием, поскольку оно не запрещено, оно разрешено. Может быть, есть другой способ справиться с y.x.y() этим, но не придумал ничего более элегантного (буду рад принять любой вклад и предложения!).

Комментарии:

1. О , это было так просто просто использовать return 1 , спасибо!

2. @Norbertas поскольку к этому нет требований, почему бы не упростить 😉

3. Я бы использовал 2 конструктора вместо 1 с константой по умолчанию int ref для новичка. Значение по умолчанию и принимающее значение int.

4. @ServeLaurijssen имеет смысл! Просто решил сохранить его компактным.

5. @rawrex Извините, я не могу задать другой вопрос из — за таймера в stackoverflow, но у меня есть вопрос с этим — #включить <алгоритм> объект класса { // Изменить это снова }; шаблон <алгоритм><объект имени типа> тест на пустоту() { Объект x[5], y = x[0]() x[1] .y(); std::сортировка(x, x 5); если (y.x.y() == 2) { возврат; } } int main(int argc, символ** argv) { тест<объект имени типа><Объект>(); возвращает 0; } Как я понимаю, все то же самое, но теперь я должен перегружать операторы?