#c
#c
Вопрос:
Я новичок в C , но знаю объектно-ориентированное программирование..
У меня есть класс, в котором есть несколько объектов разных классов.
class machine{
public:
int func();
private:
Plug p;
std::vector<Rot> r;
Ref ref;
};
Это правильный способ сделать это? Причина, по которой я не так уверен, заключается в том, что если я делаю что-то вроде cout << this->r.size()
in func
, это ничего не выводит (у меня есть правильные includes и пространства имен). Компилятор компилирует его, но программа говорит run failed
. Больше никаких сообщений. Я использую последнюю версию компилятора Cygwin g compiler.
Редактировать: я просто пытаюсь убедиться, что это правильный способ определения объекта-члена класса. Итак Plug p;
: это правильно? Потому что, если я вызываю метод в Plug
классе изнутри machine
, он не работает так, как работает, когда я вызываю подключаемый метод main()
. Более того, программа завершается с ошибкой, когда я что-то делаю с r
(the vector
)… Должен ли я каким-то образом вызывать их конструкторы? Если да, то как мне это сделать?
Спасибо за вашу помощь.
Комментарии:
1. этот код даже не компилируется … опубликуйте свой реальный код.
2. Можете ли вы вставить тело machine::func()?
3. Для форматирования кода вместо использования
<pre>
тегов просто выделите блок и нажмите{}
кнопку, Ctrl-K или, альтернативно, сделайте отступ в каждой строке с 4 или 5 пробелами (я просто не помню)4. Как вы используете этот класс?
5. Да, все, что я вижу там, правильно. Если
cout << this->r.size()
ничего не выводит, то:cout
поток находится в состоянии ошибки, вы не сбросили, вы перенаправили вывод, или поток выполнения так и не зашел так далеко.
Ответ №1:
Вам нужно ознакомиться с действительно базовыми предметами C , такими как конструкторы. При создании экземпляра машинного объекта будет вызван конструктор. В вашем случае конструктор по умолчанию создается компилятором. Этот невидимый конструктор по умолчанию также будет вызывать конструкторы по умолчанию для p, r и ref.
Что касается вашего вывода, попробуйте cout << r.size() << endl; для очистки буфера. Обратите внимание, что вы также должны вызвать x.func() в main(), где x является экземпляром machine .
Как выглядит ваш основной?
Также обратите внимание, что C в большей степени, чем многие другие языки, требует, чтобы вы хорошо понимали основы — это означает много чтения и пробования примеров для проверки вашего понимания. В этом языке есть много подводных камней и ошибок — я бы не советовал гадать или предполагать слишком много о том, как детали в других языках OO могут быть применимы к C .
Ответ №2:
Чтобы ответить на актуальный вопрос: да, это правильный способ определения элемента данных. Конструктор каждого элемента данных вызывается автоматически, компилятор генерирует для этого необходимый код.
В опубликованном вами коде нет ничего плохого, хотя, конечно, это всего лишь отрывок, поэтому трудно сказать, что происходит не так.
r.size()
на самом деле достаточно там, где у вас есть this->r.size()
. И если вы получаете сообщение об ошибке «выполнить не удалось», это не может быть просто пропущенный сброс в cout, но я полагаю, что если вы используете отладчик, должно быть легко выяснить, что пошло не так.