[C++] probleem return type static function

Pagina: 1
Acties:

  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
Normaal programmeer ik vaak in C#, maar nu ben ik bezig in C++ en kwam ik het volgende vreemde probleem tegen. In een klasse met de naam Field heb ik een static function die iets van het type Field weer terug geeft, maar de compiler slikt dit niet. Als ik het type verander in iets anders vindt hij het wel goed. Dit is de code in de header file:

C++:
1
2
3
4
5
6
7
8
9
10
class Field
{
public:
    FieldCell *cells[9][9];
    Field(void);
    ~Field(void);

    //Methods
    static Field *FromFile(char path[]);
};


Heeft iemand van jullie een idee waarom hij dit type niet pakt? Ik dacht misschien omdat het gebruikt wordt in de declaratie van die klasse, maar hoe moet je dan zoiets aanpakken?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:28
Welke foutmelding krijg je dan ?

Ik heb net even een testje gedaan (in VC++.NET), en daar lijkt het toch geen probleem:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Bliep
{
private:
    int _member;

public:
    Bliep()
    {
        _member = 0;    
    }

    void Increment()
    {
        _member++;
    }

    int GetMember()
    {
        return _member;
    }

    static Bliep* ReturnBliep()
    {
        return new Bliep();
    }

};


code:
1
2
3
4
5
6
7
8
9
10
11
int main(array<System::String ^> ^args)
{
      

    
    Console::WriteLine(Bliep::ReturnBliep()->GetMember().ToString());
    
    Console::ReadLine();

        return 0;
}

[ Voor 92% gewijzigd door whoami op 13-08-2005 18:14 ]

https://fgheysels.github.io/


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
whoami schreef op zaterdag 13 augustus 2005 @ 17:33:
Welke foutmelding krijg je dan ?
Deze foutmelding krijg ik van Visual Studio terug:

error LNK2019: unresolved external symbol "public: static class Field * __cdecl Field::FromFile(char * const)" (?FromFile@Field@@SAPAV1@QAD@Z) referenced in function _main

Terwijl er in de Main deze aanroep staat:

Field *MyField = Field::FromFile("test");

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
Heb je je functie wel een implementatie gegeven? :)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
_Mo_ schreef op zaterdag 13 augustus 2005 @ 17:38:
Heb je je functie wel een implementatie gegeven? :)
Ja, deze:
C++:
1
2
3
4
static Field Field::*FromFile(char path[])
{
    return 0;
}

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
AquilaDus schreef op zaterdag 13 augustus 2005 @ 17:40:
[...]

Ja, deze:
C++:
1
2
3
4
static Field Field::*FromFile(char path[])
{
    return 0;
}
Schrijf het eens zo op:
C++:
1
2
3
4
Field *Field::FromFile( char path[])
{
    return 0;
}

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
Volgens mij stond het * op de verkeerde plaats. Dat C++ blijft toch wennen, het lijkt alsof het probleem verholpen is.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:28
Moet dat niet zo zijn:

code:
1
2
3
4
static Field* Field::FromFile( char path[] )
{
   return new Field();
}


In je functie-prototype return je toch een pointer naar Field, en in je definitie return je gewoon een Field (die asteriks staat dus imho verkeerd).
Ik vraag me trouwens ook af, of C++ je zomaar toelaat om een integer te returnen, terwijl je aangeeft dat je eigenlijk een pointer naar Field wilt returnen ? :?

https://fgheysels.github.io/


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
whoami schreef op zaterdag 13 augustus 2005 @ 17:46:
Moet dat niet zo zijn:

code:
1
2
3
4
static Field* Field::FromFile( char path[] )
{
   return new Field();
}


In je functie-prototype return je toch een pointer naar Field, en in je definitie return je gewoon een Field (die asteriks staat dus imho verkeerd).
Ik vraag me trouwens ook af, of C++ je zomaar toelaat om een integer te returnen, terwijl je aangeeft dat je eigenlijk een pointer naar Field wilt returnen ? :?
return 0 staat gelijk aan return NULL, aangezien NULL enkel een define is voor 0 (soms ook wel (void *)0)
Het static keyword moet je trouwens weglaten bij je implementatie, compileerd anders niet :)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
_Mo_ schreef op zaterdag 13 augustus 2005 @ 17:49:
[...]

return 0 staat gelijk aan return NULL, aangezien NULL enkel een define is voor 0 (soms ook wel (void *)0)
Het static keyword moet je trouwens weglaten bij je implementatie, compileerd anders niet :)
Ja, dat had ik inderdaad gemerkt, ik heb het nu aan de praat, bedankt voor de hulp allemaal. Dat C++ blijft toch wennen als je normaal met C# werkt.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
(void*)0 is C voor NULL, in C++ is het gewoon 0. Ook (void) voor een lega argumentenlijst is C, in C++ is dat gewoon ( ).

In je definitie moet je ook geen 'static' gebruiken, dat mag alleen in de in-class declaratie.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
whoami schreef op zaterdag 13 augustus 2005 @ 17:33:
Ik heb net even een testje gedaan (in VC++.NET), en daar lijkt het toch geen probleem:
[code]
int main(array<System::String ^> ^args)
Dat is geen C++ :)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-05 21:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

AquilaDus schreef op zaterdag 13 augustus 2005 @ 17:46:
Volgens mij stond het * op de verkeerde plaats. Dat C++ blijft toch wennen, het lijkt alsof het probleem verholpen is.
Het returntype is Field* (het sterretje hoort bij het type!) en heeft dus niets met je methodenaam te maken. Het is daarom ook onlogisch om het sterretje achter de :: te tikken :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 01-05 10:06

curry684

left part of the evil twins

Dat is Managed C++ wat voor zover het dit probleem aangaat identiek functioneert.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-05 21:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee het is C++/CLI ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Yep, en dat heeft itt C++ een int.ToString( ). Bovendien heeft C++/CLI de (voor de TS) nare eigenschap om wel meer dingen te accepteren die niet in C++ zitten, en de adviezen in de foutmeldingen zijn ook niet gericht op C++.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1