类中类的构造函数带参数,并且参数还需要计算后得到,怎么处理

类中类的构造函数带参数,并且参数还需要计算后得到,怎么办
本帖最后由 sk609_king 于 2014-04-28 11:18:03 编辑
#include <iostream.h>
class CTwo
{
public:
int out;
CTwo(int i)
{ out = i * 2; }
};

class COne
{
public:
COne()
{ }
int mid;
void calc()
{ mid = 2; }
//在执行完calc之后才会产生正确的mid
//才能用mid作为CTwo的构造函数的参数来实例化CTwo
CTwo bbb(mid);  //这里出错,但是就是这个意思。不过CTwo实例化实际上应该放在calc执行之后
};

void main()
{
COne aaa;
aaa.calc();   
cout<<aaa.bbb.out<<endl;  //希望最后输出CTwo类中的out值 应该是2*2=4
}


我其实是用在窗口的创建上。自己建了一个窗口类,里面有一个CDC类,CClientDC的创建是需要先得到pWnd的,但我又想把这个CDC类和pWnd指针放在一个类里面,于是就有了上面的问题。pWnd就是在初始化窗口后才产生的东西。
------解决方案--------------------
不管你类TWO的构造函数是带参数还是不带参数,你都不能在类ONE的声明中去调用它的构造函数;类ONE的声明中只是告诉你它包含一个类TWO的成员变量而已;

你可以在窗口类中声明一个CClientDC*类型的指针变量;然后在窗口类的OnInitialDlg函数中初始话CClientDC

//窗口类头文件中声明:
CClientDC* m_pDC;
//窗口类OnInitialDld中初始化:
m_pDC=new CClientDC(this);



------解决方案--------------------
#include <iostream>
class CTwo
{
public:
    int out;
    CTwo(int i)
    { out = i * 2; }
};
 
class COne
{
public:
    COne()
    {
     bbb= 0;
    }
    ~COne()
    {
     delete bbb;
    }
    int mid;
    void calc()
    { 
     mid = 2;
     //延迟初始化bb
     bbb = new CTwo(mid);
    
    }
    CTwo* bbb;
};
 
int main()
{
    COne aaa;
    aaa.calc();   
    std::cout<<aaa.bbb->out<<std::endl;  
}

------解决方案--------------------
引用:
是不是CDC只能在用之前创建?不能创建好了留着随时调用?我好像觉得是这么回事。只能在每次画那个窗口的时候new,而不能先new好放在类里面。是这样吗?


不是这样的,你有3个独立的窗口?那么就得有3个独立的dc,可以声明含3个元素的dc数组,dc是跟窗口相关联的!
当然也可以画图的时候,针对不同的窗口声明一个局部的dc,但这样的话开销大

当然你要是贴上关键代码会更好点