Hi! I'm trying to make my own string type for my library. Anyway, I'm not very experienced with structs/classes so I don't understand what's going one here. I will not post the full code because I don't think that anyone would like it so I will just post the important parts that play a role (tho in any case feel free to ask for the full code).

Code:
```
import core.memory;

import core.stdc.stdio;
import core.stdc.string;
import core.stdc.stdlib;

struct str {
private:
  char* _val;
  uint* _count;
  ulong _cap, _len;

public:
  // Constructors
  this(const char* val) {
    printf("Debug: Called this(const char* val)\n");
    this._val = cast(char*)val;
    this._count = cast(uint*)pureMalloc(4);
    *this._count = 0;
    this._cap = 0;
    this._len = strlen(val);
  }

  // Copy constructor
  this(ref return scope str rhs) {
    printf("Debug: Copy constructor called!!! (strig rhs)\n");
    this._cap = rhs.length;
    this._len = this._cap;
    this._val = cast(char*)pureMalloc(this._len);
    strcpy(this._val, rhs.ptr);
    this._count = cast(uint*)pureMalloc(4);
    *this._count = 1;
  }

  // Assigment constructors
  str opAssign(str rhs) {
    printf("Debug: Assigment constructor called!!! (str rhs)\n");
    if (*this._count == 1) {
      free(this._val);
    } else if (*this._count > 1) {
      (*this._count)--;
    } else *this._count = 1;

    this._val = cast(char*)pureMalloc(rhs.length);
    if (!this._val) {
fprintf(stderr, "Could not allocate memory for the str object");
      exit(1);
    }

    strcpy(this._val, rhs.ptr);
    this._cap = rhs.length;
    this._len = rhs.length;
    return this;
  }

  @property char* ptr() { return _val; }
  @property ulong length() { return _len; }
}

extern (C) int main() {
  str name = "Mike";
  str other_name = "Anna";
  other_name = name;
  return 0;
}
```

So, when I assign the value of the variable "name" in the "other_name", first it will call the copy constructor, then it will call the assignment constructor and then it will call the copy constructor again. Why is this happening? I was expecting only the assignment constructor to get called.

Reply via email to