1

我正在尝试创建一个指向类指针的指针。我试图不调用默认的 c'tor,因为他推进了静态整数。所以我使用复制 c'tor 来避免推进 var,唯一的问题是我不确定什么是正确的语法。这是代码:

#include <stdio.h>


class A
{
    static int x;
    int m_x;
    int m_age;
public:
    A(){m_x=x;x++;m_age=0;}
    A(const A& that ){m_age =that.m_age; m_x = that.m_x;}
    A(int age){m_age = age;}
    int getX(){return m_x;}
    int getStaticX(){return x;}
    int getAge(){return m_age;}
};

int A::x = 0 ;

int main()
{
    int size = 15;
    A *tmp = new A[size]();
    A *tmp1;

    //I'm not sure here what is the currect symtax to do this:
    for (int i = 0; i< size;i++)
    {
        tmp1[i] = new A(tmp[i]);
    }
    ////////////////////////////////////////////////////        


    for (int i =0 ;i<size;i++)
    {
            //I want the same result in both prints
        printf("tmp1:%d\n",i);
        printf("age:%d  m_int:%d  static:%d\n",tmp1[i].getAge(),tmp1[i].getX(),tmp1[i].getStaticX());
        printf("tmp:%d\n",i);
        printf("age:%d  m_int:%d  static:%d\n",tmp[i].getAge(),tmp[i].getX(),tmp[i].getStaticX());
        printf("EOF\n\n");
    }


    return 0;
}

谢谢!

4

4 回答 4

0

好的,我已经做到了:

int main()
{
    int size = 15;
    A *tmp = new A[size]();
    A *tmp1 = tmp;

    for (int i =0 ;i<size;i++)
    {
        printf("tmp1:%d\n",i);
        printf("age:%d  m_int:%d  static:%d\n",tmp1[i].getAge(),tmp1[i].getX(),tmp1[i].getStaticX());
        printf("tmp:%d\n",i);
        printf("age:%d  m_int:%d  static:%d\n",tmp[i].getAge(),tmp[i].getX(),tmp[i].getStaticX());
        printf("EOF\n\n");
    }


    return 0;
}
于 2013-09-12T11:42:43.917 回答
0

一种方法是分配未初始化的内存并就地构造对象:

#include <memory>

A* tmp = new A[size]();
std::pair<A*,std::ptrdiff_t> buf = std:get_temporary_buffer(size);
assert(buf.second == size); // the buffer returned might be smaller than requested

A* tmp1 = buf.first;
std::uninitialized_copy(tmp, tmp+size, tmp1);

请注意,不幸的是,您的课程非常糟糕。一定要遵守三规则,并根据您的需要实现赋值运算符和析构函数并减少那里的计数器。

于 2013-09-12T11:43:24.530 回答
0

A *tmp = 新 Asize; //创建Ai指向的A的15个对象。这 15 个对象在创建时,使用new 运算符调用默认构造函数15 次。

因此,您将增加输出。相反,您应该使用

   int max_size = 15;         
   A *tmp1[size];                
   for (int i = 0; i< max_size;i++)
          tmp1[i] = &tmp[i];  

我认为这个解决方案会奏效。

于 2013-09-12T13:43:45.263 回答
0

您可以在此处此处阅读并获取复制构造函数的示例,然后执行以下操作:

A(A& that ){m_age =that.m_age; m_x = that.m_x;}

例如。

但这里的问题是您已分配tmp但未tmp1分配,因此这是对未分配内存的分配

于 2013-09-12T11:33:10.843 回答