Следующие фрагменты - это файл заголовка и фактическая функция main(). Я использую Visual Studio 2017 с Windows 10.

< Сильный > .h

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <iostream>
using namespace std;
struct Sales_data
{
    int amount;
    int rate;
    int price = amount * rate;
};
#endif

< Сильный > .cpp

#include <iostream>
#include "Sales_data.h"
using namespace std;
int main()
{
    Sales_data item1;
    cout << "Enter rate and amount" << endl;
    cin >> item1.rate >> item1.amount;
    cout << item1.price << endl;
    cin.get();
    cin.get();
    return 0;
}

Это продолжает показывать это как вывод: «687194768».

Я также попытался инициализировать переменные, но это не похоже на работу.

c++
-1
user6916886 4 Сен 2017 в 18:12

4 ответа

Лучший ответ

Что вы, вероятно, хотите, это:

struct Sales_data
{
    int amount = 0;
    int rate = 0;

    int price() const { return amount * rate; }
};

А потом

std::in >> item1.rate >> item1.amount;
std::cout << item1.price() << std::endl;
3
Jarod42 4 Сен 2017 в 15:14

Цена здесь рассчитывается только во время инициализации, чтобы получить ее начальное значение, однако, поскольку amount и rate еще не были инициализированы, результатом будет undefined . Это не функция.

struct Sales_data
{
    int amount;
    int rate;
    int price = amount * rate;
};

Скорее всего, вы хотели функцию, например:

struct Sales_data
{
    int amount;
    int rate;
    int calcPrice()
    {
        return = amount * rate;
    }
};


std::cout << item1.calcPrice() << std::endl;

Или вам придется рефакторинг для инициализации amount и rate, чтобы использовать такой синтаксис, например, с конструктором.

struct Sales_data
{
    int amount;
    int rate;
    int price = amount * rate;
    Sales_data(int amount, int rate) : amount(amount), rate(rate) {}
};


Sales_data x(10, 5);
//x.price == 50
2
idclev 463035818 4 Сен 2017 в 15:20

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

Определить функцию в структуре и вызывать ее после ввода

void calculatePrice() {
    price = amount * rate;
}

cin >> item1.rate >> item1.amount;
item1.calculatePrice();
cout << item1.price << endl;
0
ΦXocę 웃 Пepeúpa ツ 4 Сен 2017 в 15:18

Как прокомментировали другие, ваше определение для Sales_data использует amount или rate до их инициализации. Это неопределенное поведение, и ваш компилятор более или менее свободен делать с ним все, что пожелает.

Многие компиляторы инициализируют переменные с каким-то распознаваемым защитным значением (популярный выбор - 0xDEADBEEF), чтобы сделать его совершенно очевидным, когда значение неинициализировано при просмотре с помощью отладчика. В этом случае, похоже, ваш компилятор использует 0xCCCCCCCC в качестве этого защитного значения:

(lldb) p (int) 0xcccccccc * (int) 0xcccccccc (int) $2 = 687194768

0
pdpi 4 Сен 2017 в 15:54