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

标签 c++ c++17 initialization-list 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;
}

输出:
0-0-0-a

期望的输出:
1-2-3-b

编辑:This question目标是其他(为什么,而不是如何)而不是我的,它的答案对我的帮助不如这个主题的答案。

最佳答案

What is wrong with the variable international_standard_book_number? How can I make it that it changes, whenever isbn_field_i changes?



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

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

我的意思是......相反
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;};


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}
{}

现在你的示例代码写
1-2-3-b

有什么变化?


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;};

首先你的字段是默认初始化的,所以
isbn_field_1    = 0;
isbn_field_2    = 0;
isbn_field_3    = 0;
digit_or_letter = 'a';

international_standard_book_number="0"+"-"+"0"+"-"+"0"+"-"+'a';

然后执行构造函数的主体
isbn_field_1    = 1;
isbn_field_2    = 2;
isbn_field_3    = 3;
digit_or_letter = 'b';

但是 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}
{}

初始化列表初始化字段(并替换默认初始化)
isbn_field_1    = 1;
isbn_field_2    = 2;
isbn_field_3    = 3;
digit_or_letter = 'b';

然后执行international_standard_book_number的默认初始化但使用新值,所以
international_standard_book_number="1"+"-"+"2"+"-"+"3"+"-"+'b';

关于c++ - 如何让一个变量依赖于一个类中的其他变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60652051/

相关文章:

c++ - 使用指针和非默认构造函数 boost 序列化

c++ - 基于范围的 for with range_expression 从 std::vector 返回非空项

c++ - 对使用 STL 并行算法的用户有何限制?

c++ - 将 std::unordered_map 值移动到 std::vector

c++ - 在 C++ 类中使用复杂函数初始化 const 成员

c++ - 在 C++ 中,使用初始化列表的定义和原始类型的 '=' 字符之间有什么区别吗?

c++ - 如何使用套接字编程控制文件传输中的下载速率/上传速率

C++ 使用字符串项在列表中查找结构?

c++ - 防止用户创建类的未命名实例

c++ - 防止 Core Dump 使用空指针初始化字符串