Классы объектов c

#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, но я полагаю, что если вы используете отладчик, должно быть легко выяснить, что пошло не так.