no suitable constructor exists to convert from "test *" to "test", constructor,

67,604

Solution 1

I imagine you're coming from a Java/C# background. t is not a reference type here, it's a value type. new returns a pointer to an object. So you need any of the following:

test t = test("rrr", 8);
test t("rrr", 8);
test *t = new test("rrr", 8);

If you're not yet familiar with pointers, then definitely don't use the last one! But understanding the semantics of pointers is fairly critical; I recommend reading the relevant chapter(s) in your textbook...

Solution 2

So, whats the thing with classes having "*" in their name ( for instance, classes without .cpp file dont have asterix, all others do)???

You definitely need to learn about pointers. test * and test are two completely different types in C++. Here's two variables with those types:

test t;
test* p;

Here, t has type test, and p as type test*. We describe test* as "pointer to test".

You can often think of a pointer as being the memory address of an object. So in p, since it is a pointer, we could store the memory address of t, which is a test. To get the address of an object, we use the unary & operator, like so:

test t;
test* p = &t;

Note that t is a test object. You didn't need to say new test(). This is where C++ differs from other languages that you might have used, like C# and Java. In the above C++ code, t is a test object.

However, you can create objects with new test(), so what's the difference?

test t; creates a test object with automatic storage duration. This means it is destroyed at the end of its scope (often the function is being declared within).

new test() creates a test object with dynamic storage duration. This means you have to destroy the object manually, otherwise you'll have a memory leak. This expression returns a pointer and so you can initialise a pointer object with it:

test* p = new test();

So now let's look at your problem:

test t=new test("rrr",8);

We now know that new test("rrr", 8) returns a pointer to test (a test*). However, you're trying to assign it to a test object. You simply can't do this. One of them is an address and the other is a test. Hence the compiler says "no suitable constructor exists to convert from test * to test." Makes sense now, doesn't it?

Instead, you should prefer to use automatic storage duration. Only use new if you really really need to. So just do:

test t("rrr", 8);

Solution 3

test t=new test("rrr",8);

must be

//  v
test* t=new test("rrr",8);

So, whats the thing with classes having "*" in their name

* is used to indicate a pointer, it's not in the name of the class. But it's a big topic, so you should do some reseach on this.

Solution 4

T* t = new T;
//     ^^^

When new is used in this object construction, it denotes the creation of a pointer. What are doing is dynamically allocating memory which I'm sure you didn't mean to do. The Rather, typical stack allocated object construction is done simply like this:

T t;

Even if you had intended on creating a pointer and allocating the memory, you did it the wrong way. A pointer is created with the * symbol, which you lacked in your code. Secondly, when you're done using the memory you created, you must remember to delete/delete[] your code. delete[] is used on dynamically allocated arrays. So this is how it would look for your pointer:

delete t;

Solution 5

* is not part of the name, it's a modifier denoting, that the object is a pointer. A pointer is a variable holding address to some place in memory, where the actual object is stored. Some basics:

int i = 5;
int * pI = &i;

int * pI means, that you want to declare a pointer to place in memory, where an int is held. &i means, that you want to retrieve a pointer to variable. So now pI holds address in memory, where i is stored. Now you can dereference a pointer - get to value of the pointer:

int j = *pI;

Now you tell the compiler, that it should go to the address pointed to by pI and retreive its contents (since pI is a pointer to int, compiler will assume, that there's an int there).

Now, back to your example. new operator allocates memory dynamically for an object, so:

new test("rrr", 8);

results in allocating a memory for test class, calling its constructor with parameters "rrr" and 8 and returning a pointer to allocated memory. That's why you cannot assign it to test variable: new operator in this case returns a test *.

Try this code:

test * t = new test("rrr", 8);
Share:
67,604

Related videos on Youtube

klo
Author by

klo

Updated on July 09, 2022

Comments

  • klo
    klo almost 2 years

    I'm new to c++ and I'm having difficulties with constructor and classes. So, here is my header file:

    #pragma once
    #include <string>
    using namespace std;
    class test
    {
    
        private:
        string name;
        int number;
    
    public:
    
        test();
        test(string i,int b);
    };
    

    This is cpp file:

    #include "test.h"
    #include <string>
    using namespace std;
    
    
    test::test(){}
    
    test::test(string i,int b){
        this->name=i;
        this->number=b;
    }
    

    now, when I try to call

    test t=new test("rrr",8);
    

    I get:

    1   IntelliSense: no suitable constructor exists to convert from "test *" to "test" 
    

    So, whats the thing with classes having * in their name ( for instance, classes without .cpp file don't have asterix, all others do)? And what do I do wrong?

  • Kiril Kirov
    Kiril Kirov about 11 years
    Nice, your answer is much better than mine :) +1
  • klo
    klo about 11 years
    tnx a lot. u guessed right, i did programming in java and c# so im i bit struggling with c++ :) ....
  • john
    john about 11 years
    @klo If you try to program C++ like you programmed Java you will make loads of mistakes. They are not very similar at all.
  • LuisDev99
    LuisDev99 over 4 years
    "I imagine you're coming from a Java" that hurted but thanks anyways lol, i was missing the * operator before my variable name