teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

見当外れだったようなので削除

2018/01/18 09:43

投稿

colonq
colonq

スコア88

answer CHANGED
@@ -1,77 +1,1 @@
1
- ポインタのサイズは一定なのでC++14ならばvectorのunique_ptrでメンバー変数を持てばいいかと。
2
- 一応書いてはみましたが、初心者には少々難しすぎるかもしれません。
3
- ```C++
4
- #include <iostream>
5
- #include <vector>
6
- #include <memory>
7
- #include <utility>
8
-
9
- class Value
10
- {
11
- public:
12
- Value() = default;
13
- Value(const Value& v) : number(v.number), values(nullptr)
14
- {
15
- if (v.values) values = std::make_unique<std::vector<Value>>(*(v.values));
16
- }
17
- Value(Value&&) = default;
18
- Value& operator =(const Value& v)
19
- {
20
- if (this != &v) {
21
- number = v.number;
22
- values = nullptr;
23
- if (v.values) values = std::make_unique<std::vector<Value>>(*(v.values));
24
- }
25
- return *this;
26
- }
27
- Value& operator =(Value&&) = default;
28
- ~Value() = default;
29
-
30
- Value(double n) : number(n) {}
31
- Value& operator =(double n) {number = n;}
32
- Value(const std::vector<Value>&);
33
- void print() const;
34
-
35
- private:
36
- double number;
37
- std::unique_ptr<std::vector<Value>> values;
38
- };
39
-
40
- Value::Value(const std::vector<Value>& v)
41
- : number(0.0)
42
- , values(std::make_unique<std::vector<Value>>(v))
43
- {}
44
-
45
- void Value::Value::print() const
46
- {
47
- if (values) {
48
- auto& v = *values;
49
- int size = static_cast<int>(v.size());
50
- std::cout << "{";
51
- v[0].print();
52
- for (int i = 1; i < size; ++i) {
53
- std::cout << ",";
54
- v[i].print();
55
- }
56
- std::cout << "}";
57
- } else {
58
- std::cout << number;
59
- }
60
- }
61
-
62
- int main()
63
- {
64
- std::vector<Value> v1 = {3.4, 5.6};
65
- Value v2 = 7.8;
66
- std::vector<Value> v3 = {1.2, v1, v2};
67
- Value v4 = v3;
68
-
69
- v4.print();
70
- std::cout << std::endl;
71
-
72
- using V = std::vector<Value>;
73
- Value v5 = V{0.1, V{0.3, 0.5}, 0.7};
1
+ 再帰呼び出しが全く無関係とは。まるで見当外れだったようなので削除します。
74
- v5.print();
75
- std::cout << std::endl;
76
- }
77
- ```

3

valuesの初期化も忘れてた:-)

2018/01/18 09:43

投稿

colonq
colonq

スコア88

answer CHANGED
@@ -19,6 +19,7 @@
19
19
  {
20
20
  if (this != &v) {
21
21
  number = v.number;
22
+ values = nullptr;
22
23
  if (v.values) values = std::make_unique<std::vector<Value>>(*(v.values));
23
24
  }
24
25
  return *this;

2

number = v.number の位置を移動

2018/01/17 15:05

投稿

colonq
colonq

スコア88

answer CHANGED
@@ -17,8 +17,8 @@
17
17
  Value(Value&&) = default;
18
18
  Value& operator =(const Value& v)
19
19
  {
20
- number = v.number;
21
20
  if (this != &v) {
21
+ number = v.number;
22
22
  if (v.values) values = std::make_unique<std::vector<Value>>(*(v.values));
23
23
  }
24
24
  return *this;

1

numberの初期化を忘れていたので修正

2018/01/17 13:38

投稿

colonq
colonq

スコア88

answer CHANGED
@@ -17,6 +17,7 @@
17
17
  Value(Value&&) = default;
18
18
  Value& operator =(const Value& v)
19
19
  {
20
+ number = v.number;
20
21
  if (this != &v) {
21
22
  if (v.values) values = std::make_unique<std::vector<Value>>(*(v.values));
22
23
  }
@@ -66,6 +67,10 @@
66
67
 
67
68
  v4.print();
68
69
  std::cout << std::endl;
70
+
71
+ using V = std::vector<Value>;
72
+ Value v5 = V{0.1, V{0.3, 0.5}, 0.7};
73
+ v5.print();
74
+ std::cout << std::endl;
69
75
  }
70
-
71
76
  ```