简体   繁体   中英

c++ assign a 2D array to an Object

My code pass the compiler, but I have a question about the concept of the pointer.

main.cpp:

int main(int argc, const char * argv[])
{
    int inputPuzzle[3][3];

    std::cout << "Set the puzzle: " << "\n";
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            std::cin >> inputPuzzle[i][j];
        }
    }

    puzzle puzzle_1 = *new puzzle(inputPuzzle);
    puzzle_1.display();

    return 0;
}

puzzle.h:

class puzzle
{
    public:
        puzzle();
        puzzle(int [][maxCol]);
        ~puzzle();
    public:
        int puzz [maxRow][maxCol];
};

puzzle.cpp:

puzzle::puzzle(int a[][maxCol])
{
    for (int i = 0; i < maxRow; i++) {
        for (int j = 0; j < maxCol; j++) {
            puzz[i][j] = a[i][j];
        }
    }
}

My question is about the statement : puzzle puzzle_1 = *new puzzle(inputPuzzle);

Why do I have to add "*" in front of the new object in which I want to assign a 2D array ?

You're programming C++, where new returns a pointer. When you use the asterisk it's the dereference operator, and basically turns a pointer into a non-pointer.

Using the dereference operator like that means that you actually lose the pointer created by new , and you can not free that allocated memory with delete which, of course, leads to a memory-leak.

To avoid losing the pointer, you have to declare the variable as a pointer:

puzzle* puzzle_1 = new puzzle(inputPuzzle);

Then you have to use the pointer member selector operator instead when accessing members:

puzzle_1->display();

And, to avoid leaking memory, when you're done with the pointer you must delete it:

delete puzzle_1;

However, in C++ there is seldom any need to use pointers; instead just declare it as a normal variable:

puzzle puzzle_1(inputPuzzle);
puzzle_1.display();

Unrelated to your question, but if maxRow or maxCol is larger than 3 , then you will read from outside the memory for the array inputPuzzle . This will lead to undefined behavior .

The most important part here is the new keyword. It returns a pointer to the newly instantiated object. Check the Dynamic memory allocation for more information and to understand when and how to use pointers, and how the new keyword works.

Now, we know that the new keyword returns a pointer, and you want to obtain an object not a pointer, hence you have to dereference your pointer.

Two correct solutions now:

// without pointers
puzzle puzzle_1(inputPuzzle); // initialize the object without going through a copy 
puzzle_1.display();

// with pointers
puzzle *puzzle_1 = new puzzle(inputPuzzle);
puzzle_1->display(); //notice that we used -> here as it's a pointer
// do stuffs here
delete puzzle_1; // free the memory

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM