如何让一个变量依赖于一个类中的其他变量?

SAJ*_*AJW 6 c++ initialization-list c++17 default-initialization

变量有什么问题international_standard_book_number?我怎样才能让它改变,无论何时isbn_field_i改变?

#include <iostream>
#include <string>

class ISBN
{
private:
  unsigned int isbn_field_1 = 0;
  unsigned int isbn_field_2 = 0;
  unsigned int isbn_field_3 = 0;
  char digit_or_letter = 'a';
  std::string international_standard_book_number =
    std::to_string(isbn_field_1) + "-" + std::to_string(isbn_field_2) + "-" +
    std::to_string(isbn_field_3) + "-" + digit_or_letter;

public:
  ISBN()
  {
    isbn_field_1 = 0, isbn_field_2 = 0, isbn_field_3 = 0, digit_or_letter = 'a';
  }
  ISBN(unsigned int a, unsigned int b, unsigned int c, char d)
  {
    isbn_field_1 = a, isbn_field_2 = b, isbn_field_3 = c, digit_or_letter = d;
  }
  friend std::ostream& operator<<(std::ostream& os, ISBN const& i)
  {
    return os << i.international_standard_book_number;
  }
};

int
main()
{
  ISBN test(1, 2, 3, 'b');
  std::cout << test << "\n";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

0-0-0-a
Run Code Online (Sandbox Code Playgroud)

期望的输出:

1-2-3-b
Run Code Online (Sandbox Code Playgroud)

编辑:这个问题针对的不是我的问题(为什么,而不是如何),它的答案对我的帮助没有这个话题的答案那么大。

max*_*x66 9

变量有什么问题international_standard_book_number?我怎样才能让它改变,无论何时isbn_field_i改变?

一般而言:每当一个组件发生变化时,您都必须重新分配它。

在您的特定情况下:使用初始化列表更改构造函数。

我的意思是......相反

ISBN(unsigned int a, unsigned int b, unsigned int c, char d)
 {isbn_field_1=a, isbn_field_2=b, isbn_field_3=c, digit_or_letter=d;};
Run Code Online (Sandbox Code Playgroud)

ISBN(unsigned int a, unsigned int b, unsigned int c, char d)
 : isbn_field_1{a}, isbn_field_2{b}, isbn_field_3{c}, digit_or_letter{d}
{}
Run Code Online (Sandbox Code Playgroud)

现在你的示例代码写

1-2-3-b
Run Code Online (Sandbox Code Playgroud)

有什么变化?

ISBN(unsigned int a, unsigned int b, unsigned int c, char d)
 {isbn_field_1=a, isbn_field_2=b, isbn_field_3=c, digit_or_letter=d;};
Run Code Online (Sandbox Code Playgroud)

首先你的字段是默认初始化的,所以

isbn_field_1    = 0;
isbn_field_2    = 0;
isbn_field_3    = 0;
digit_or_letter = 'a';

international_standard_book_number="0"+"-"+"0"+"-"+"0"+"-"+'a';
Run Code Online (Sandbox Code Playgroud)

然后执行构造函数的主体

isbn_field_1    = 1;
isbn_field_2    = 2;
isbn_field_3    = 3;
digit_or_letter = 'b';
Run Code Online (Sandbox Code Playgroud)

international_standard_book_number保持不变。

ISBN(unsigned int a, unsigned int b, unsigned int c, char d)
 : isbn_field_1{a}, isbn_field_2{b}, isbn_field_3{c}, digit_or_letter{d}
{}
Run Code Online (Sandbox Code Playgroud)

初始化列表初始化字段(并替换默认初始化)

isbn_field_1    = 1;
isbn_field_2    = 2;
isbn_field_3    = 3;
digit_or_letter = 'b';
Run Code Online (Sandbox Code Playgroud)

然后international_standard_book_number使用新值执行默认初始化,所以

international_standard_book_number="1"+"-"+"2"+"-"+"3"+"-"+'b';
Run Code Online (Sandbox Code Playgroud)


sup*_*per 5

使用成员函数。

#include <iostream>
#include <string>

class ISBN
{
private:
    unsigned int isbn_field_1=0;
    unsigned int isbn_field_2=0;
    unsigned int isbn_field_3=0;
    char digit_or_letter='a';
    std::string international_standard_book_number() const {
        return std::to_string(isbn_field_1)+"-"+std::to_string(isbn_field_2)+"-"+std::to_string(isbn_field_3)+"-"+digit_or_letter;
    }
public:
    ISBN(){isbn_field_1=0, isbn_field_2=0, isbn_field_3=0, digit_or_letter='a';}
    ISBN(unsigned int a, unsigned int b, unsigned int c, char d){isbn_field_1=a, isbn_field_2=b, isbn_field_3=c, digit_or_letter=d;};
    friend std::ostream &operator<<(std::ostream &os, ISBN const &i) 
    { 
        return os << i.international_standard_book_number();
    }
};


int main()
{
    ISBN test(1,2,3,'b');
    std::cout << test << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C++ 中的变量使用值语义。当你做

std::string international_standard_book_number=
std::to_string(isbn_field_1)+"-"+std::to_string(isbn_field_2)+"-"+std::to_string(isbn_field_3)+"-"+digit_or_letter;
Run Code Online (Sandbox Code Playgroud)

它将international_standard_book_number根据isbn_field_n现在拥有的值分配一个值。它不会在这些变量之间创建某种自动链接,以确保它们保持同步。

如果您想要这种行为,则必须确保international_standard_book_number每次更新其他字段时都进行更新。