Avatar billede hurra Novice
16. august 2005 - 17:50 Der er 17 kommentarer og
1 løsning

Operator = skal kalde en funktion

Jeg har lavet noget kode der minder meget om det her, det her er bare lige en forsimplet version.

struct TSettings
{
  public:
      TTest *Owner;
      int top;
      int left;
      TSettings(TTest *Owner);

  TSettings& operator =(const TSettings &lfs)
  {
      top = lfs.top;
      left = lfs.left;
      Owner->UpdateSettings();
  }

};

class TTest
{
  private:
      int pTop, pLeft;
  public:
      TSettings settings;
      UpdateSettings();

};

TTest::UpdateSettings()
{
  pTop = settings.top;
  pLeft = settings.left;
}

Min plan er så at jeg et helt andet sted har noget der minder om:
TTest *T1 = new T1();
TTest *T2 = new T2();
...
T1->settings = T2->settings;

Når ovenstående linie her sker, bliver operator = jo brugt, og den skal så kalde funktionen UpdateSettings() i Owner (som så vil være T1 i det her tilfælde).

Det virker bare ikke for godt, jeg kan ikek kompilere koden, da TSettings ikke kender TTest, og hvis jeg bytter om på dem kender TTest ikke TSettings. Jeg har prøvet at lave en "prototype" til TTest, men det virker heller ikke, for så kender den ikke TTest->UpdateSettings();

Nogle bud ?
Avatar billede arne_v Ekspert
16. august 2005 - 17:56 #1
class TTest;

struct TSettings
{
  public:
      TTest *Owner;
      int top;
      int left;
      TSettings(TTest *Owner);

  TSettings& operator =(const TSettings &lfs);
};


class TTest
{
  private:
      int pTop, pLeft;
  public:
      TSettings settings;
      UpdateSettings();

};

  TSettings& TSettings::operator =(const TSettings &lfs)
  {
      top = lfs.top;
      left = lfs.left;
      Owner->UpdateSettings();
  }


TTest::UpdateSettings()
{
  pTop = settings.top;
  pLeft = settings.left;
}
Avatar billede hurra Novice
16. august 2005 - 17:59 #2
Det har jeg prøvet, så skriver den "UpdateSettings() is not a member on TTest"
Avatar billede hurra Novice
16. august 2005 - 18:00 #3
Undskyld, jeg havde ikke set ordentlig efter. Jeg prøver lige iven.
Avatar billede hurra Novice
16. august 2005 - 18:00 #4
iven = igen
Avatar billede hurra Novice
16. august 2005 - 18:45 #5
Mærkligt, jeg har lavet lidt om i det exempel du sendte. Det virker fint, så prøvede jeg at rette det til jeg egentligt skulle bruge det i, men nu virker det ikke. Når jeg kompilere skriver den:
[C++ Error] FixSiteUnit.cpp(54): E2279 Cannot find default constructor to initialize member 'TFixSite::Settings'

Ved du hvad det betyder? Eller skal du bruge lidt kode?
Avatar billede arne_v Ekspert
16. august 2005 - 18:48 #6
det betyder at TFixSite klassens field Settings har en type som ikke
har en constructor uden argumenter

det har intet med det oprindelige problem at gøre

post evt. lidt kode for forslag til løsning
Avatar billede hurra Novice
16. august 2005 - 18:49 #7
Det skal forresten måske siges at det jeg har lavet om  er at flydte deklerationerne af klasserne over i en header fil, og funktionerne i en cpp fil. Og det virker jo altså.
Avatar billede hurra Novice
16. august 2005 - 19:02 #8
Ok, nu tror jeg jeg forstår. I TFixSite, er Settings erklæret som:
      fsSettings Settings;
Men constructoren til Settings er:
__fastcall fsSettings::fsSettings(TFixSite *Owner)
Så der skal jeg selvføldig ha this, eller noget lignende, med. Men hvordan:
      fsSettings *Settings;
virker, men så skal jeg jo også ændre alle de stedet i koden hvor jeg bruger Settings fre:
      Fix[FS_FIX1]->Settings.ShowEIDLabel = true;
til:
      Fix[FS_FIX1]->Settings->ShowEIDLabel = true;
Det er saftsusseme mange steder. Er der en anden løsning ?
Avatar billede arne_v Ekspert
16. august 2005 - 19:19 #9
prøv:

TFixSite(whatever) : Settings(this) {
  bla bla
}
Avatar billede hurra Novice
16. august 2005 - 19:25 #10
Jeg er ikke helt med, hvor henne ad ?
Kom forresten lige med et svar, du har jo besvaret mit oprindelige spørgsmål.
Avatar billede arne_v Ekspert
16. august 2005 - 19:28 #11
TFixSite constructor
Avatar billede arne_v Ekspert
16. august 2005 - 19:28 #12
og svar
Avatar billede hurra Novice
16. august 2005 - 19:40 #13
Jeg er lige gået tilbage til Test tingen. Det ser sådan her ud:
class TTest
{
  private:
      int pTop, pLeft;
  public:
      TTest() : TSettings();
      TSettings settings;
      UpdateSettings();

};
TTest::TTest() : TSettings(this)
{
}
Og så får jeg fejlen [C++ Error] Unit1.h(30): E2312 'TSettings' is not an unambiguous base class of 'TTest'

men, der er også lige en detajle. Jeg har lige lavet de med pointer løsningen (men jeg er stadig meget interesseret i at vide hvordan jeg gør det andet). Jeg kan se at de indstillinger jeg laver på den ene, godt nok også bliver ført over på den anden når jeg bruger =. Men funktionen UpdateSettings bliver ikke kørt bliver ikke kørt.
Avatar billede hurra Novice
16. august 2005 - 19:41 #14
Jeg opretter lige et nyt spørgsmål til det sidste problem her.
Avatar billede arne_v Ekspert
16. august 2005 - 19:42 #15
jeg tror at du bliver glad for pointer løsningen i det lange løb

man skal aldrig bruge egne klasser inden i sine klasser

class TTest
{
  private:
      int pTop, pLeft;
  public:
      TTest();
      TSettings settings;
      UpdateSettings();

};
TTest::TTest() : settings(this)
{
}
Avatar billede arne_v Ekspert
16. august 2005 - 19:42 #16
men jeg ved ikke om man må bruge this så tidligt
Avatar billede hurra Novice
16. august 2005 - 19:46 #17
Avatar billede hurra Novice
16. august 2005 - 19:47 #18
Ahhh, jeg havde T med i settings.
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