【问题标题】:How to call CFileDialog class constructor如何调用 CFileDialog 类的构造函数
【发布时间】:2013-07-28 21:52:45
【问题描述】:

我需要一个用于类的所有成员函数的 CFileDialog 对象。所以我把类的标题写成:

#pragma once
#include <string.h>
#include "afxdlgs.h"
#include "gdal_priv.h"
#include "cpl_conv.h"
#include "cpl_string.h"
#include "ogr_spatialref.h"


class FilesWorkFlow
{
public:
    FilesWorkFlow(void);
    virtual ~FilesWorkFlow(void);
    CString GetPath();
    GDALDataset* OpenTiff(CString);
private:
    wchar_t* lpszFilter;
    CFileDialog dlgFile;
};  

并以这种形式实现了类的构造函数:

FilesWorkFlow::FilesWorkFlow(void)
{
    lpszFilter = _T("JPEG Files (*.jpg)|*.jpg|")
    _T("TIFF Files (*.tif)|*.tif|")_T("PNG Files (*.png)|*.png|")_T("Bitmap Files (*.bmp)|*.bmp|");

    dlgFile = CFileDialog(true,0,0,OFN_ENABLESIZING | OFN_HIDEREADONLY,lpszFilter,0,0,true);
}  

但是在构造函数中,我得到了错误:

no default constructor exists for class CFileDialog  

有什么问题?

----------------------------------------------- --------------------------------------------------------

问题解决了。我以这种方式实现了课程。

FilesWorkFlow.h

class FilesWorkFlow
{
public:
    FilesWorkFlow(void);
    virtual ~FilesWorkFlow(void);
    CString GetPath();
    GDALDataset* OpenTiff(CString);
private:
    wchar_t* lpszFilter;
    CFileDialog* dlgFile;
};  

FilesWorkFlow.cpp

FilesWorkFlow::FilesWorkFlow(void)
{
        lpszFilter = _T("JPEG Files (*.jpg)|*.jpg|")
    _T("TIFF Files (*.tif)|*.tif|")_T("PNG Files (*.png)|*.png|")_T("Bitmap Files (*.bmp)|*.bmp|");
        dlgFile = new CFileDialog(true,0,0,OFN_ENABLESIZING | OFN_HIDEREADONLY,lpszFilter,0,0,true);
}


FilesWorkFlow::~FilesWorkFlow(void)
{
}


CString FilesWorkFlow::GetPath()
{
    if (dlgFile->DoModal() == IDOK)
    {
        CString pathname = dlgFile->GetPathName();
        return pathname;
    }
 }

【问题讨论】:

    标签: visual-studio-2010 visual-c++ constructor mfc cfiledialog


    【解决方案1】:

    要专门化CFileDialog,您通常从它派生,而不是使其成为类成员。但是,无论您做什么,解决方案都是通过初始化列表初始化 CFileDialog 对象。你的构造函数看起来像这样:

    FilesWorkFlow::FilesWorkFlow(void) :
        dlgFile( true, 0, 0,
                 OFN_ENABLESIENABLESIZING | OFN_HIDEREADONLY,
                 _T("JPEG Files (*.jpg)|*.jpg|TIFF Files (*.tif)|*.tif|PNG Files (*.png)|*.png|Bitmap Files (*.bmp)|*.bmp||"),
                 0, 0, true )
    {
    }
    

    【讨论】:

    • 感谢@Tim,但这种方式dlgFile 只会在构造函数中知道,而不是在其他函数成员中知道,正如我告诉迈克尔的回答一样。顺便问一下To specialize the CFileDialog you usually derive from it, instead of making it a class member 是什么意思?你能再解释一下吗?
    • @sepideh 上面的代码假定dlgFile 是在您的初始类定义中声明的类成员。因此,所有成员函数都可以访问它。 CFileDialog 通常要么按原样使用,要么如果你想修改它的行为,即为你的用例专门化它,派生自。您的派生类可以访问CFileDialog 的所有公共和受保护成员。例如,这允许您通过覆盖 OnTypeChange 来实现对类型更改的自定义处理。
    • 感谢@Tim,这是最好的解决方案。我不会失去班级CFileDialog的能力,我也会有自己的功能来提升能力。
    【解决方案2】:

    试试这个:

    FilesWorkFlow::FilesWorkFlow(void)
    {
        lpszFilter = _T("JPEG Files (*.jpg)|*.jpg|")
        _T("TIFF Files (*.tif)|*.tif|")_T("PNG Files (*.png)|*.png|")_T("Bitmap Files (*.bmp)|*.bmp|");
    
        CFileDialog *dlgFile = new CFileDialog(true,0,0,OFN_ENABLESIZING | OFN_HIDEREADONLY,lpszFilter,0,0,true);
        ...
        delete dlgfile ;
    }
    

    FilesWorkFlow::FilesWorkFlow(void)
    {
        lpszFilter = _T("JPEG Files (*.jpg)|*.jpg|")
        _T("TIFF Files (*.tif)|*.tif|")_T("PNG Files (*.png)|*.png|")_T("Bitmap Files (*.bmp)|*.bmp|");
    
        CFileDialog dlgFile(true,0,0,OFN_ENABLESIZING | OFN_HIDEREADONLY,lpszFilter,0,0,true);
        ...
    }
    

    【讨论】:

    • 感谢@Michael Waltz,但这样dlgFile 将成为构造函数的局部变量,并且在类的其他函数中不可用。我需要dlgFile 成为该类的成员数据。
    • 您的实现似乎是正确的,但最终您必须调用“delete dlgFile ;”可能在 FilesWorkFlow 类的析构函数中。请接受我的回答。谢谢。
    • 感谢@Michael Walz,但是如果我在类的析构函数中调用delete dlgFile 会有什么风险?
    • 正常情况下没有风险。但是如果你省略了delete,你就会有内存泄漏。对于每个X = new ...,您必须在某处有一个delete X ;
    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2021-03-14
    • 2018-09-26
    • 2016-07-19
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多