###### tags: `learning` `data structure` # Note for asking Prof. Huang 20190527 c++ code https://github.com/y56/ntut_ds_hw3/blob/master/Note-for-asking-Prof-Huang-20190527.cpp print-out https://github.com/y56/ntut_ds_hw3/blob/master/Note-for-asking-Prof-Huang-20190527.cpp.out run by http://cpp.sh/ ## Questions ### Constructor and pointer Why`datumItemPtr2` and `&datumItem2` have different value? 我以為把datumItemPtr2指向的對象指派給datumItem2,datumItem2的地址就會和datumItemPtr2一樣 ### Destructor Why `&datumItem2` still has non-null value after destruction? 也有可能是我的Destructor根本沒造對 ### Values in the stack Why all the values in the stack is the same? 我本來期待會有各自的地址存在裡面,但都存一樣地址的,而且是一個全新的地址 ## C++ source code ```cpp= #include <iostream> using namespace std; class DatumItem { public: int key = -1; // Key, a positive int char datumChar = '\0'; // satellite datum, assume each datum is only a char. DatumItem () // constructor w/o input, using some default values {} DatumItem (int newKey, char newDatumChar) // constructor with input { key = newKey; datumChar = newDatumChar; } ~DatumItem () // destructor // not sure what to do {}; }; class ArrayStack { public: // for convenience, set everything public int top; int arrayLen; DatumItem** stack; // a pointer for basr address ArrayStack () // constructor { top = -1; // -1 means nothing is in the stack // the array index position to where we add an next element will be top+1 arrayLen = 8; // default array length as 8 stack = new DatumItem*[arrayLen] ; // an array of addresses of `DatumItem` objects } void push (DatumItem datumItem) // Insert a data item to top. // Anyway, I will use the address of each `DatumItem` object as an element in an array. { stack[top+1] = &datumItem; top++; for (int i = 0; i < arrayLen; i++) { cout << stack[i] << " | "; } cout << endl; } }; int main () { // test DatumItem destructor cout << "***** Use constructor" << endl<<endl; DatumItem* datumItemPtr2 = new DatumItem(2, 'b'); // The asterisk is required. // Create a datumItem and get its address cout << "content of datumItemPtr2: " << datumItemPtr2 << endl; DatumItem datumItem2 = *datumItemPtr2; // get the content to whcih datumItemPtr2 points cout << "address of datumItem2: " << &datumItem2 << endl; datumItem2.~DatumItem(); // try to destruct cout << endl << "***** Use destructor" << endl<<endl; cout << "content of datumItemPtr2: " << datumItemPtr2 << endl; cout << "address of datumItem2: " << &datumItem2 << endl; // test ArrayStack ArrayStack* arrayStackPtr = new ArrayStack(); // The asterisk is required. // creat multiple datumItems for testing `push` DatumItem datumItem3 = DatumItem(3, 'c'); DatumItem datumItem4 = DatumItem(4, 'd'); DatumItem datumItem5 = DatumItem(5, 'e'); DatumItem datumItem6 = DatumItem(6, 'f'); // print their address cout << endl << "***** print the addresses of datumItems:" << endl<<endl; cout << datumItem3.key <<" "<< datumItem3.datumChar <<" "<< &datumItem3 << endl; cout << datumItem4.key <<" "<< datumItem4.datumChar <<" "<< &datumItem4 << endl; cout << datumItem5.key <<" "<< datumItem5.datumChar <<" "<< &datumItem5 << endl; cout << datumItem6.key <<" "<< datumItem6.datumChar <<" "<< &datumItem6 << endl; // test push on ArrayStack cout << endl << "***** start pushing and printing my stack:" << endl<<endl; arrayStackPtr->push( datumItem3 ); // can't use arrayStackPtr.push() arrayStackPtr->push( datumItem4 ); // can't use arrayStackPtr.push() arrayStackPtr->push( datumItem5 ); // can't use arrayStackPtr.push() arrayStackPtr->push( datumItem6 ); // can't use arrayStackPtr.push() return 0; } ``` ## Output ```= ***** Use constructor content of datumItemPtr2: 0x2120a30 address of datumItem2: 0x725c4abda790 ***** Use destructor content of datumItemPtr2: 0x2120a30 address of datumItem2: 0x725c4abda790 ***** print the addresses of datumItems: 3 c 0x725c4abda7a0 4 d 0x725c4abda7b0 5 e 0x725c4abda7c0 6 f 0x725c4abda7d0 ***** start pushing and printing my stack: 0x725c4abda7e0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x725c4abda7e0 | 0x725c4abda7e0 | 0 | 0 | 0 | 0 | 0 | 0 | 0x725c4abda7e0 | 0x725c4abda7e0 | 0x725c4abda7e0 | 0 | 0 | 0 | 0 | 0 | 0x725c4abda7e0 | 0x725c4abda7e0 | 0x725c4abda7e0 | 0x725c4abda7e0 | 0 | 0 | 0 | 0 | ```