前天去金山笔试,出了4个题目。
考完以后出来,觉得比较简单的几个题目,似乎都做错了。
没抱什么希望的情况下,竟然叫我去面试,呵呵,结果仍旧是空欢喜一场!
我来说说题目吧,第一题就是一个简单的,MFC类库中的一个对象调用方法。
第二题,考察对指针变量,指针常量的sizeof,以及在类中字节对齐的知识点。
第三题,考察纠错能力。
第四题:
vector<int*>类型的变量,里面存储的是指针,他们需要我们手动来释放他们,比较麻烦,要求我们用SmartVector兼容vector,而且能够自己回收内存。
按道理,我认为似乎应该下面这样写,虽然考试的时候,我写错了格式,但是思路是:
应该要把指针类型弄个偏特化,毕竟不能对一个对象做delete吧。
现在改了下:
#include <iostream>
#include <vector>
using namespace std;template<class T>
class SmartVector:public vector<T>
{
public:
SmartVector(){}
SmartVector(const SmartVector&s)
{
copy(s.begin(),s.end(),begin());
}
SmartVector& operator=(const SmartVector&s)
{
copy(s.begin(),s.end(),begin());
return *this;
}
};template<class T>
class SmartVector<T*>:public vector<T*>
{
public:
SmartVector(){}
SmartVector(const SmartVector&s)
{
copy(s.begin(),s.end(),begin());
}
SmartVector& operator=(const SmartVector&s)
{
copy(s.begin(),s.end(),begin());
return *this;
}
~SmartVector()
{
while(size()!=0)
{
T* bk=back();
pop_back();
delete bk;
}
}
};
void func()
{
SmartVector<int*>svpi;
for(int i=0;i<5;i++)
{
int *p=new int;
svpi.push_back(p);
}
}
int main(int argc, char* argv[])
{
SmartVector<int>svi;
for(int i=0;i<5;i++)
svi.push_back(1);
func();
return 0;
}呵呵。昨天面试也认识2个朋友,一个已经成功进入今天面试。他是这样写的
但是似乎是正确答案(他说他可能对了 ):
template<class T>
class SmartVector<T>:public vector<T>
{
public:
SmartVector(){}
~SmartVector()
{
while(size()!=0)
{
T bk=back();
pop_back();
delete bk;
}
}
};不知道金山的答案如何哦。

解决方案 »

  1.   

    呵呵,ls的朋友。我4月份开始接触的编程。您呢?对于delete你知道只能作用于指针吗?他的程序,只有T是指针才行,那么请问。如果是对象呢?我的程序很乱吗?呵呵,不会吧!
      

  2.   

    这一段是我用来跟踪的时候用的,上面才是写的类!
    ======================================================
    void func()
    {
    SmartVector<int*>svpi;
    for(int i=0;i<5;i++)
    {
    int *p=new int;
    svpi.push_back(p);
    }
    }
    int main(int argc, char* argv[])
    {
    SmartVector<int>svi;
    for(int i=0;i<5;i++)
    svi.push_back(1);
    func();
    return 0;
    }
    ======================================================
      

  3.   

    我干了三年多了,都不知道delete只能作用于指针,惭愧啊~~~
      

  4.   

    啊?delete原来可以对对象做delete?我试试,惭愧
      

  5.   

    不行啊???int main()
    {
    int a;
    delete a;
    return 0;
    }
    --------------------Configuration: 123 - Debug--------------------
    Compiling source file(s)...
    1.cpp
    1.cpp: In function `int main()':
    1.cpp:12: error: type `int' argument given to `delete', expected pointer123.exe - 1 error(s), 0 warning(s)
      

  6.   

    我想问下:
    template<class T>
    class SmartVector<T>:public vector<T>
    {
    public:
        SmartVector(){}
        ~SmartVector()
        {
            while(size()!=0)
            {
                T bk=back();
                pop_back();
                delete bk;
            }
        }
    };
    void main()
    {
       SmartVector<int*>scpi;
       
       SmartVector<int>sci;
       for(int i=0;i<10;i++)
       {
           int n=i;
           sci.push_back(n);
       }
    }
    这可以吗?析构的时候没问题吗?
      

  7.   

    不是啊,似乎没看清楚题目吧?
    ==========================================================
    vector<int*>类型的对象,析构之前必须自己手动delete.
    请设计一个类SmartVector兼容vector.能自己回收内存。
    ==========================================================
    请问,不偏特化,直接在析构函数里加delete,那叫兼容vector???
    如果是这样,那这题还考个屁啊?一共也就4题。我是觉得这个题唯一难的地方就是判断<>里面的是不是指针,是指针才delete,否则默认析构函数。
      

  8.   

    http://www.eimhe.com/bbs/adget.php?id=379765美河学习在线——专业视频课程下载基地
      

  9.   

    int main()
    {
    int a;
    delete a;
    return 0;
    }程序可以这样写,我第一次发现。楼主强啊。
      

  10.   

    int a;
    delete a;??这样可以写吗?
      

  11.   

    int main()
    {
    int a;
    delete a;
    return 0;
    }程序可以这样写,我第一次发现。楼主强啊。=---------------------------------=朋友们,不要越扯越远好不好,一楼一楼的看,不要断章取义
      

  12.   

    你们在说什么呢? delete 不就是用来释放在heap上分配的空间吗?
      

  13.   

    我想了半天还是没理解   fortius()   说的话?为什么我想让程序真正兼容vector,成为STL一般的容器,却说是片面?通用却被说为片面?
      

  14.   


    内容是MFC+STL?!好没劲~~~~~~~~~~~~~~~~~~~~~~~~~
      

  15.   

    楼主,我后天也去金山面试,应该去注意点什么呢?32bits Operating System--Developped by WY.lslrt http://www.wyos.net
      

  16.   

    to booklove(纳海行云) :又一个没看清题目的人,他是要我们自己写一个类,来兼容vector;同时能够自己回收内存,
    而不是写应用程序。题目要求只是写类。
      

  17.   

    template<typename C,typename F>
    class SmartVector
    :public C
    {
        public:
        ~SmartVector()
         {
            std::for_each(begin(),end(),F());
         }
    };
    typedef vector<int*> vector_i;
    struct release
    {
        void operator()(int*p){delete p;}
    };
    typedef SmartVector<vector_i,release> SmartVector_i;
      

  18.   

    foochow(恰似你的温柔)恩,你写的很合我的心意。谢谢说出你的做法!
      

  19.   

    这种写法很强:
      template<typename C,typename F>
    class SmartVector
    :public C
    {
    public:
    ~SmartVector()
    {
    std::for_each(begin(),end(),F());
    }
    };
    typedef vector<int*> vector_i;
    struct release
    {
    void operator()(int*p){delete p;}
    };
    typedef SmartVector<vector_i,release> SmartVector_i;
      

  20.   

    这种写法很酷:
      template<typename C,typename F>
    class SmartVector
    :public C
    {
    public:
    ~SmartVector()
    {
    std::for_each(begin(),end(),F());
    }
    };
    typedef vector<int*> vector_i;
    struct release
    {
    void operator()(int*p){delete p;}
    };
    typedef SmartVector<vector_i,release> SmartVector_i;