#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; } Как я понимаю, все то же самое, но теперь я должен перегружать операторы?