C : как мне вычесть два целых числа из разных классов?

#c

#c

Вопрос:

Прежде чем я что-нибудь скажу, я хочу уточнить, что я начинающий программист и потратил всего около 2 месяцев на C .

У меня была эта проблема некоторое время, и я, похоже, не могу найти ответ!

Чтобы было понятно, я не пытаюсь оптимизировать эту «игру». Я просто пытаюсь практиковать свои классы.

Вот пример:

 #include <iostream>

using namespace std;

int main() {
    Health = Health - dmgNinja;
    cout << Health << endl;    
}
  

В отдельном заголовке класса:

 class Enemy {
public:
    void dmgNinja();
};
  

В отдельном классе cpp:

 int dmgNinja = 42;

namespace std {

void Enemy::dmgNinja() {
    cout << dmgNinja << endl;
}

}
  

В отдельном заголовке класса:

 class Bandit {
public:
    void Health();
};
  

В отдельном классе cpp:

 int Health = 100;

namespace std {

void Bandit::Health() {
    cout << Health << endl;
}

}
  

Короче говоря, я хочу знать, как вычесть две переменные из разных классов, а затем распечатать их в основном файле, убедившись, что любая измененная переменная остается измененной.

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

1. Пожалуйста, не используйте пространство std имен для своих собственных вещей. Это пространство имен стандартных библиотек!

2. Не заключайте свой код в namespace std{} use std::cout и std::endl вместо этого. На самом деле не используйте std::endl use 'n' . ;)

3. Это не будет компилироваться, потому что работоспособность не определена в вашем основном. Также вам, безусловно, не следует помещать свои данные в пространство имен std.

Ответ №1:

Вот пример:

 class Taco
{
 public:
   int sauce;
};
class Burrito
{
  public:
    int cheese;
};

int main(void)
{
  Burrito b;
  Taco    t;
  b.cheese = 5;
  t.sauce  = 3;
  int difference = 0;
  // Here's the subtraction
  difference = b.cheese - t.sauce;
  return EXIT_SUCCESS;
}
  

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

1. Это, вероятно, самый простой способ сделать это. @Pablo проблема, с которой вы, вероятно, сталкиваетесь, заключается в том, что ваши переменные не являются частью класса.

2. Большое вам спасибо! Я знаю, что это, вероятно, был глупый вопрос, но я не смог найти ответ. Еще один вопрос. Теперь я понимаю, как вычитать классы. Итак, если бы я хотел изменить b.cheese на 2. Тогда я бы сделал b.сыр = b.сыр — т.соус?

3. Если вы хотите изменить b.cheese значение на 2, вы бы сделали b.cheese = 2; . Относитесь к ним так, как к переменной, не входящей в структуру.

4. Если этот ответ был полезен, пожалуйста, нажмите на галочку.

Ответ №2:

Чтобы ответить на вашу прямую проблему, вам нужно объявить Health как extern в заголовке или в вашем main.cpp досье.

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

Кстати, ваш вопрос вводит в заблуждение, потому что то, что вы на самом деле пытаетесь сделать, это просто вычесть одно целое число из другого и присвоить результат одному из операндов. Ваши классы ни в коем случае не используются в вашем коде.

Ответ №3:

Я вижу там два вопроса.

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

Правило состоит в том, что оба атрибута должны быть видны оттуда.
Так что это могут быть, например, общедоступные атрибуты (видимые везде) или частные атрибуты с помощью метода доступа или атрибуты дружественного класса.

Поначалу вся эта суета с конфиденциальностью может показаться хлопотной, но именно это делает большие объемы кода (что-то вроде 10.000 строк или более) управляемыми. Если вы ограничите доступ к заданному значению, только небольшая часть кода, скорее всего, изменит его, и найти причину ошибки будет проще, чем если бы вам пришлось проверять весь проект на наличие неправильной строки кода.
Кроме того, объявление переменной public или private никак не влияет на код, который фактически генерируется компилятором. Это просто вопрос контроля.
Вот почему новичкам постоянно напоминают, что глобальные переменные — это неправильный простой выход. Решение о том, куда поместить ваши данные и какие части вашей программы будут авторизованы для их чтения или записи, требует дополнительной работы. В небольших учебных примерах это может показаться бесполезным.
Но как только вы напишете свои собственные несколько сотен строк кода и потеете над несколькими сеансами отладки, вы скоро поймете, насколько это полезно. Допустим, сейчас вам понадобится небольшой скачок веры :).

Теперь о «какой бы переменной (которая) ни была изменена, она остается измененной», это в основном вопрос продолжительности жизни ваших переменных. Надеюсь, у вас будут лекции об этом. Глобальные переменные, локальные переменные, динамические переменные. Святая троица продолжительности жизни.

В вашем случае я не совсем понимаю, в чем ваша проблема. Если ваша цель действительно напечатать разницу, вам даже не нужна переменная для ее хранения.

 void print_diff(void)
{
    int a = 5;
    int b = 3;

    printf ("%d - %d = %dn", a, b, a-b);
}
  

Здесь хранятся только два значения, в переменных a и b .
Разница a-b существует внутри компьютера только на время, необходимое для извлечения значений, их вычитания и printf отображения результата.
Вы можете сохранить эту разницу в какой-либо локальной, глобальной или динамической переменной, даже записать ее на диск, чтобы она сохранялась до тех пор, пока ваш жесткий диск не выйдет из строя, но какой в этом смысл?