C++ 空指针数组

C++ 空指针数组,c++,arrays,pointers,stack,void-pointers,C++,Arrays,Pointers,Stack,Void Pointers,同样,这个问题也源于“用C++思考”第7章,Q#7。我认为堆栈头文件应该更改为Stack.h #ifndef STACK_H #define STACK_H class Stack { struct Link { void* data; Link* next; Link(void* dat, Link* nxt); ~Link();

同样,这个问题也源于“用C++思考”第7章,Q#7。我认为堆栈头文件应该更改为Stack.h

        #ifndef STACK_H
        #define STACK_H

        class Stack {
          struct Link {
            void* data;
            Link* next;
            Link(void* dat, Link* nxt);
            ~Link();
          }* head;
        public:
          Stack();
          Stack(void* arr[], int size);
          ~Stack();
          void push(void* dat);
          void* peek();
          void* pop();
        };
在Stack.cpp中实现Stack::Stack(void*arr[],int size),我相信可能是这样的:

       Stack::Stack(void* arr[], int size)
       {
         for (int i=0; i<size; i++)
          {
            push(arr[i]);
          }
       }
Stack::Stack(void*arr[],int size)
{

对于(int i=0;i你的堆栈构造函数要求一个关于填充的指针数组,你给它一个对象数组。作为奖励,我给你适当的主函数并释放内存^^

#include <cstdlib>
// --- Includes your stuffs ---

using namespace std;

int main(int argc, char* argv[]) {
  string* tst_arr[] = new string[3];
  tst_arr[0] = new string("hi 1");
  tst_arr[1] = new string("hi 2");
  tst_arr[2] = new string("hi 3");
  Stack string_arr((void**)tst_arr, 3);

  // --- Do your stuffs ---

  for(int i =0; i < 3; ++i)
    delete tst_arr[i];
  delete[] tst_arr;

  return EXIT_SUCCESS;
}
#包括
//---包括你的东西---
使用名称空间std;
int main(int argc,char*argv[]){
字符串*tst_arr[]=新字符串[3];
tst_arr[0]=新字符串(“hi 1”);
tst_arr[1]=新字符串(“hi 2”);
tst_arr[2]=新字符串(“hi 3”);
堆栈字符串\u arr((void**)tst\u arr,3);
//---做你的事---
对于(int i=0;i<3;++i)
删除tst_arr[i];
删除[]tst_arr;
返回退出成功;
}

<代码> >(空**)TSTYARR < /COD>技术上是错误的,虽然它可能不是你问题的根源。我想说,放弃这种疯狂。无论如何,你不会学到任何有用的东西(<代码> Value*<代码>根本不应该用在C++中)。先学习模板然后尝试写你的栈。(再说一次,不要在真正的代码中使用它——而是使用标准的库容器)。“用C++思考”显然是一个用词不当。这个家伙用C思考。每次你以
void**
结束时,你都知道你是很多人。别管它!请不要在家里尝试这个孩子们:-)正因为如此,才有一个std::stack。感谢您的回复,我认为数组初始化应该更改为:string*tst_arr[3]={new string(“hi 1”)、new string(“hi 2”)、new string(“hi 3”)};否则,编译器会给你一些如上所述的错误。对于内存空闲,我仍在深入研究,因为Stack->pop已经释放了指针,我认为根据我的初始化,删除tst_arr[I]或删除[]tst_arr都是不必要的,对吧?Bo:想象一下在采访中你被要求实现自己的堆栈,你能说吗“有std::stack存在,孩子,你不知道吗?"我认为这是有道理的,即使轮子确实存在,也必须有人知道如何制作它们,对吗?因此,如果你的pop函数调用delete,那么是的,不需要像我在代码片段中所做的那样进行删除。但总的来说,将任务分开是很好的,这里是内存管理和堆栈。通过在你的pop方法中执行删除,你的堆栈也会被删除承担内存管理的角色。您可能需要在不删除指针的情况下堆叠指针,这种情况经常发生,例如在处理树或图形时。。。
#include <cstdlib>
// --- Includes your stuffs ---

using namespace std;

int main(int argc, char* argv[]) {
  string* tst_arr[] = new string[3];
  tst_arr[0] = new string("hi 1");
  tst_arr[1] = new string("hi 2");
  tst_arr[2] = new string("hi 3");
  Stack string_arr((void**)tst_arr, 3);

  // --- Do your stuffs ---

  for(int i =0; i < 3; ++i)
    delete tst_arr[i];
  delete[] tst_arr;

  return EXIT_SUCCESS;
}