Avatar billede nagual Nybegynder
31. maj 2002 - 22:35 Der er 7 kommentarer

Hvordan fixer man en compiler error: C2385: 'Open1::delete'

Hej med jer!
Jeg programmerer i Microsoft Visual C++ 6.0. Jeg er ved at lave en CPropertySheet, som blandt andet indeholder en CPropertyPage med CFiledialog som base class. Jeg har selvfølgeligt oprettet en class som hedder:
class Open1 : public CFileDialog, public CPropertyPage.
Når jeg nu compiler programmet, får jeg en error C2385: 'Open1::delete' is ambiguous, som peger på constructoren i Open1::Open1()
Dette skyldes at compileren ikke kan vide hvilken af de to base class, som den skal delete; men spørgsmålet er så hvad jeg kan gøre ved det!
Med venlig hilsen
Tomas Rasmussen
tomasr@mail.sonofon.dk
Avatar billede kamikaze Nybegynder
01. juni 2002 - 13:20 #1
Prøv at poste noget af din kode her :-)
Avatar billede greybeard Nybegynder
01. juni 2002 - 14:27 #2
med en almindelig function x() i begge Base classes ville syntaksen være:

using CFileDialog::x;

eller:

using CPropertyPage::x;

Da compileren bruger syntaksen Open1::delete ville jeg prøve at erstatte x med delete.
eks.:

using CFileDialog::delete;

eller måske:

using CFileDialog::~CFileDialog;

Eller lav din egen destructor og kald Base klassernes fra den.
Avatar billede nagual Nybegynder
02. juni 2002 - 23:13 #3
Hej med jer!
Jeg har lige snakket med Paul Dilascia (VC++ Guru), og han siger at man ikke kan lave en CPropertyPage med en custom CFileDialog som base class. Det man kan gøre istedet for er at lave sin helt egen CFileDialog class, og så gøre den til en CPropertyPage. Dette skyldes at MFC ikke understøtter "multiple inheritance".
Jeg har prøvet at gøre det som greybeard foreslår, men det virker ikke, for compileren siger at man er nød til at gøre "delete" til en global.
Her har i en forsimplet udgave af den dialog som jeg snakker om:

// Open1

IMPLEMENT_DYNAMIC(Open1, CFileDialog)

Open1::Open1(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
                DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
                CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd),  CPropertyPage(Open1::IDD)
{
        using CFileDialog::delete;
}



Open1::~Open1()
{

}

BEGIN_MESSAGE_MAP(Open1, CFileDialog)

Hvis i kan løse dette problem så ville jeg være meget glad!!
Med venlig hilsen Tomas Rasmussen
Avatar billede jpk Nybegynder
03. juni 2002 - 09:13 #4
Hvis du skal kalde en funktion i en baseklasse skal du bare skrive CBaseClass::Function();
(ikke using foran)
Avatar billede nagual Nybegynder
09. juni 2002 - 21:42 #5
Jeg forstår ikke helt hvad du mener jpk???
Avatar billede nagual Nybegynder
09. juni 2002 - 21:46 #6
Hrm. Jeg forstår nu hvad du mener, men compileren kommer med en fejl: error C2834: 'operator delete' must be globally qualified.
Hvad skal jeg gøre for at løse dette???
Avatar billede soepro Nybegynder
15. januar 2003 - 09:03 #7
1) Hvorfor vil du delete i din constructor ?

2) Hvis du skal delete noget, skal du som minimum pege på det som skal delete's - dvs. normalt member-variabler. Hvis det er fordi du vil nedlægge base klassen, så skal du kalde base-klassens destructor (brug 'this' til at fortælle at det er den aktuelle instans der skal nedlægges):

class c1
{
  public:
  char *a = NULL;
  c1(char *s) { a = new char(strlen(s)); strcpy(a, s); };
  ~c1() { if (a != NULL) delete[] a; };
}
class c2 : c1
{
  public:
  int x;
  c2(int s) ( x = s; };
  ~c2() { this::~c1(); }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester