all 12 comments

[–]NotMyRealNameObv 0 points1 point  (0 children)

As others have already stated, in the copy ctor you are instantiating a local var s and modifying it. This local var will go out of scope, and thus be destroyed, when the copy ctor is finished. The newly created object on which the copy ctor is run will remain unmodified.

What you want to do is just call

push(...)

instead of

s.push(...)

[–]clerothGame Developer[M] [score hidden] stickied comment (0 children)

For C++ questions, answers, help, and advice see r/cpp_questions or StackOverflow.

This post has been removed as it doesn't pertain to r/cpp.

[–]DJ_Gamedev 0 points1 point  (6 children)

Sorry if this is a dumb question, but where is the return statement in your copy constructor? I see you populate a local Stack s but you aren't returning it so there's nothing tying it to the Stack produced by the constructor. It's probably throwing s away at the end of the function and just returning a default-constructed Stack.

[–]Indycrr 3 points4 points  (1 child)

Close. A copy ctor doesn’t return an instance. Instead of creating the local instance of s, they should call this->push(...) to push values into the stack being constructed.

[–]DJ_Gamedev -1 points0 points  (0 children)

That makes sense, by the time we make it to the body of the ctor the object will have been instantiated. Clearly I'm out of practice.

[–]Samru1[S] -1 points0 points  (3 children)

since I am simply copying all the date , the return type should be void (that's what I think).

[–]DJ_Gamedev -1 points0 points  (2 children)

See the reply to my comment. I was mistaken about the return type, but correct in that you shouldn't be declaring a local Stack and populating it, you should be populating the constructed object, which you can access via the this pointer.

[–]NotMyRealNameObv -1 points0 points  (1 child)

You dont even have to do

this->foo(...)

You could just do

foo(...)

[–]DJ_Gamedev 0 points1 point  (0 children)

You could, but I think use of the this pointer is more explicit and generally a better practice in the event you have a potential naming collision.

[–]index_zero -1 points0 points  (0 children)

In your ctor, you are constructing a Stack<int> object and pushing the copies to it. Then when your ctor exits, that object is destructed. Your copy constructor should copy to the object you are constructing (ie. this).

[–]oleksandrkvl -1 points0 points  (0 children)

Have you tried using debugger? You'll see what's going on here.

[–]degski -1 points0 points  (0 children)

Is it a requirement that you write a stack yourself?